繁体   English   中英

多个子查询,一个返回超过1行

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM