多个子查询,一个返回多行

icnyk63a  于 2021-06-24  发布在  Mysql
关注(0)|答案(5)|浏览(328)
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行
如何修复?

z9zf31ra

z9zf31ra1#

您有两个子查询。

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 是被看见的,并且返回看见最多的那一个。这可能也适用于其他子查询。

0lvr5msh

0lvr5msh2#

第一个子查询返回的行数超过1行。

WHERE IDEMPLEADO = (
   SELECT IDEMPLEADO FROM ENVIOS WHERE IDPRODUCTO = (

你可以用“in”代替“=”

WHERE IDEMPLEADO IN (
     SELECT IDEMPLEADO FROM ENVIOS WHERE IDPRODUCTO = (

不过,最好检查一下为什么会得到多个值(1-n),是要使用all还是选择limit 1,或者现在有新问题:)

apeeds0o

apeeds0o3#

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) );

在外部子查询中,如果是数字,则可能是distinct或max。希望这有帮助。

6ioyuze2

6ioyuze24#

我相信您可以通过使用in或exists子句而不是使用equals来解决这个问题。这将允许子查询返回多个结果

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
                )
        )
z2acfund

z2acfund5#

一个快速解决办法是增加另一个限制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
 )

相关问题