[英]Multiple subqueries, one returns more than 1 row
SELECT NOMBRE_E 'EMPLEADO'
FROM EMPLEADOS
WHERE IDEMPLEADO = (
SELECT IDEMPLEADO FROM ENVIOS WHERE IDPRODUCTO = (
SELECT B.IDPRODUCTO
FROM ENVIOS B
GROUP BY B.IDPRODUCTO
ORDER BY COUNT(*) DESC
LIMIT 1
)
)
错误:子查询返回的行数超过1
如何解决?
快速解决方案是添加另一个限制1。但是,如果没有更多信息,很难说它是否正确。
SELECT NOMBRE_E 'EMPLEADO'
FROM EMPLEADOS
WHERE IDEMPLEADO = (
SELECT IDEMPLEADO FROM ENVIOS WHERE IDPRODUCTO = (
SELECT B.IDPRODUCTO
FROM ENVIOS B
GROUP BY B.IDPRODUCTO
ORDER BY COUNT(*) DESC
LIMIT 1
)
LIMIT 1
)
您有两个子查询。
SELECT B.IDPRODUCTO
FROM ENVIOS B
GROUP BY B.IDPRODUCTO
ORDER BY COUNT(*) DESC
LIMIT 1
和
SELECT IDEMPLEADO FROM ENVIOS WHERE IDPRODUCTO = (
...
)
第一个有一个LIMIT 1
来保证它只返回一次运行。 另一个没有。 简单的解决方法是添加一个LIMIT 1
。
SELECT IDEMPLEADO FROM ENVIOS WHERE IDPRODUCTO = (
...
) LIMIT 1
但是,您应该首先检查为什么此查询返回多个行。 似乎正在根据产品ID从发货表中选择员工ID。 如果返回一名以上的雇员,则LIMIT 1
将从该列表中随机选择一名雇员。 您可能不想要那样。
如果多次返回相同的员工ID,则可以使用DISTINCT
将其减小为1。
SELECT DISTINCT IDEMPLEADO FROM ENVIOS WHERE IDPRODUCTO = (
...
)
如果返回的是不同的员工ID,则必须询问这是否是运行正确的查询。 例如,第一个查询使用GROUP BY B.IDPRODUCTO ORDER BY COUNT(*) DESC LIMIT 1
来按每个B.IDPRODUCTO
被查看的次数对列表进行排序,并返回被查看次数最多的列表。 这也可能适合您的其他子查询。
SELECT NOMBRE_E 'EMPLEADO'
FROM EMPLEADOS
WHERE IDEMPLEADO = (SELECT DISTINCT(IDEMPLEADO)
FROM ENVIOS
WHERE IDPRODUCTO = (SELECT B.IDPRODUCTO
FROM ENVIOS B
GROUP BY B.IDPRODUCTO ORDER BY COUNT(*) DESC LIMIT 1) );
在外部子查询中,如果是数字,则可能是非重复或MAX。 希望这可以帮助。
我相信您可以通过使用IN或Exists子句而不是使用等于来解决此问题。 这将允许子查询返回多个结果
SELECT NOMBRE_E 'EMPLEADO'
FROM EMPLEADOS
where exists
(
SELECT IDEMPLEADO
FROM ENVIOS
WHERE IDPRODUCTO = (
SELECT B.IDPRODUCTO
FROM ENVIOS B
GROUP BY B.IDPRODUCTO
ORDER BY COUNT(*) DESC LIMIT 1
)
and ENVIOS.IDEMPLEADO = Empleados.IDEMPLEADO
);
或IN子句
SELECT NOMBRE_E 'EMPLEADO'
FROM EMPLEADOS
WHERE IDEMPLEADO in (
SELECT IDEMPLEADO
FROM ENVIOS
WHERE IDPRODUCTO = (
SELECT B.IDPRODUCTO
FROM ENVIOS B
GROUP BY B.IDPRODUCTO
ORDER BY COUNT(*) DESC LIMIT 1
)
)
您的第一个子查询返回的行多于1条。
WHERE IDEMPLEADO = (
SELECT IDEMPLEADO FROM ENVIOS WHERE IDPRODUCTO = (
您可以使用“ IN”代替“ =”
WHERE IDEMPLEADO IN (
SELECT IDEMPLEADO FROM ENVIOS WHERE IDPRODUCTO = (
但是,最好检查为什么要获得多个值(1-n),是要使用全部还是选择限制1,或者现在遇到新问题:)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.