Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Consulta inválida do MySQL:nível muito alto de aninhamento para seleção


Pode estar relacionado aobug #41156 do MySQL, Lista de tabelas derivadas atua como uma cadeia de -subconsultas aninhadas .

O log de bug indica que foi verificado em relação ao MySQL 5.0.72, 5.1.30 e 6.0.7.
Corrigido no MySQL 5.1.37, MySQL 5.4.2 (que se tornou 5.5.alguma coisa) e NDB 7.1.0 .

Em relação à sua consulta redesenhada na pergunta acima:

As consultas dinâmicas podem ser complicadas. Você pode usar o método sugerido por Andrew em sua resposta . Se você pesquisar muitos valores UPC, precisará escrever o código do aplicativo para criar a consulta SQL, acrescentando tantas cláusulas JOIN quanto o número de valores UPC que está procurando.

O MySQL tem um limite no número de junções que podem ser feitas em uma única consulta, mas o exemplo que você deve fazer não atinge o limite. Ou seja, a consulta que você mostra funciona.

Suponho que você esteja mostrando uma consulta de exemplo pesquisando quatro códigos UPC, enquanto seu aplicativo pode construir a consulta dinamicamente para um número maior de códigos UPC e, às vezes, pode ser mais de 61.

Parece que o objetivo da sua consulta é retornar lojas que tenham pelo menos um dos códigos UPC listados. Você pode fazer isso de forma mais simples na seguinte consulta:
SELECT DISTINCT s.*
FROM allStores AS s
JOIN storeCheckRecords AS cr
  ON s.e_address = cr.e_address
     AND cr.upc IN ('650637119004','650637119011','650637374007','650637374014');

Você pode usar esse método de outras maneiras, por exemplo, para encontrar lojas que tenham todos os quatro UPCs:
SELECT s.*
FROM allStores AS s
JOIN storeCheckRecords AS cr
  ON s.e_address = cr.e_address
     AND cr.upc IN ('650637119004','650637119011','650637374007','650637374014');
GROUP BY s.e_address
HAVING COUNT(DISTINCT upc) = 4;

Ou para encontrar lojas que alguns, mas não todos os quatro UPCs:
SELECT s.*
FROM allStores AS s
JOIN storeCheckRecords AS cr
  ON s.e_address = cr.e_address
     AND cr.upc IN ('650637119004','650637119011','650637374007','650637374014');
GROUP BY s.e_address
HAVING COUNT(DISTINCT upc) < 4;

Ou para encontrar lojas que não possuem todos os quatro UPCs:
SELECT s.*
FROM allStores AS s
JOIN storeCheckRecords AS cr
  ON s.e_address = cr.e_address
     AND cr.upc IN ('650637119004','650637119011','650637374007','650637374014');
WHERE cr.e_address IS NULL;

Você ainda precisa escrever algum código para criar essa consulta, mas é um pouco mais fácil de fazer e não excede nenhum limite no número de junções ou subconsultas que você pode executar.