sql >> Base de Datos >  >> RDS >> Mysql

MySQL Consulta no válida:nivel demasiado alto de anidamiento para seleccionar

Podría estar relacionado con Error de MySQL n.° 41156, la lista de tablas derivadas actúa como una cadena de -subconsultas anidadas .

El registro de errores indica que se verificó con MySQL 5.0.72, 5.1.30 y 6.0.7.
Corregido en MySQL 5.1.37, MySQL 5.4.2 (que se convirtió en 5.5.algo) y NDB 7.1.0 .

Con respecto a su consulta rediseñada en la pregunta anterior:

Las consultas dinámicas pueden ser complicadas. Puede usar el método sugerido por Andrew en su respuesta . Si busca muchos valores UPC, debe escribir el código de la aplicación para generar la consulta SQL, agregando tantas cláusulas JOIN como la cantidad de valores UPC que está buscando.

MySQL tiene un límite en la cantidad de uniones que se pueden hacer en una sola consulta, pero el ejemplo que deberías no alcanza el límite. Es decir, la consulta que muestra funciona.

Supongo que está mostrando una consulta de ejemplo que busca cuatro códigos UPC, mientras que su aplicación puede construir la consulta dinámicamente para una mayor cantidad de códigos UPC, y a veces puede ser más de 61.

Parece que el objetivo de su consulta es devolver tiendas que tengan al menos uno de los códigos UPC enumerados. Puede hacerlo de manera más simple en la siguiente 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');

Puede utilizar este método de otras formas, por ejemplo, para buscar tiendas que tengan los cuatro UPC:

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;

O para encontrar tiendas que tengan algunos pero no los cuatro UPC:

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;

O para encontrar tiendas que carezcan de los cuatro UPC:

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;

Todavía tiene que escribir algo de código para construir esta consulta, pero es un poco más fácil de hacer y no excede ningún límite en la cantidad de uniones o subconsultas que puede ejecutar.