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

时间:2016-10-05 19:44:49

标签: mysql sql

 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行

如何解决?

5 个答案:

答案 0 :(得分: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
 )

答案 1 :(得分: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的次数,并返回最常见的那个。{{3}}。这也可能适合您的其他子查询。

答案 2 :(得分:0)

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。希望这会有所帮助。

答案 3 :(得分:0)

我相信你可以通过使用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
                )
        )

答案 4 :(得分:0)

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

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

您可以使用'IN'代替'='

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

然而,你最好检查为什么你得到多个值(1-n),无论你是想要使用全部还是选择限制1,或者你现在都有新问题:)