为什么此子查询不能返回多行?

时间:2019-04-21 21:27:22

标签: mysql django database subquery django-orm

查询由Django ORM使用RawSQL生成:

SELECT `productos`.`codigo_barras`, (
        SELECT
            articulos.costo_us * (1 + articulos.iva_coef)
        FROM
            articulos
        INNER JOIN (
                SELECT 
                    articulos.id, MAX(encargosProveedor.fecha_entrega)
                FROM
                    articulos, encargosProveedor_listado_articulos, encargosProveedor, itemArticulosProveedor
                WHERE
                    articulos.id = itemArticulosProveedor.articulos_id AND
                    encargosProveedor.id = encargosProveedor_listado_articulos.encargosproveedor_id
                GROUP BY
                    articulos.producto_id
            )
        AS ultimos ON articulos.id = ultimos.id
) AS `ultimo_precio` FROM `productos`

正在给出错误

  

1242-子查询返回多于1行

这是子查询

的结果
+----+--------------------------------------+
| id | MAX(encargosProveedor.fecha_entrega) |
+----+--------------------------------------+
|  1 |              2019-04-17              |
+----+--------------------------------------+
|  3 |              2019-04-17              |
+----+--------------------------------------+

我阅读了MYSQL文档,但我不明白为什么返回两行会出现问题。我尝试了很多替代方法。

问题出在哪里?

2 个答案:

答案 0 :(得分:1)

包含在SELECT语句的列中的子查询称为“标量子查询”。标量子查询应该只能产生零行或一行,因为它的值(标量)将被放置在查询结果集的返回行中,在该行中只能容纳一个值。因此,如果子查询返回的行多于单个行,则它不能直接用作SELECT列。

一种选择是强制其最多产生一行,也许使用诸如MAX()MIN()COUNT()等聚合函数。

另一种选择是将子查询作为“表表达式”联接,其中对返回的行数没有限制。

答案 1 :(得分:0)

评论太久了。

不是

SELECT articulos.id, MAX(encargosProveedor.fecha_entrega) 
FROM ...

子查询就是问题所在。由于这是JOIN表达式的一部分,因此它可以返回多个行。 但是,因为该返回多行,所以周围的子查询:

SELECT articulos.costo_us * (1 + articulos.iva_coef)
FROM articulos
INNER JOIN (SELECT articulos.id, MAX(encargosProveedor.fecha_entrega)
            FROM ...)

还将返回多个行。

您需要找出一种方法来防止外部子查询返回多行,即使内部子查询返回多行,也可能使用MINMAX之类的聚合函数。另外,您需要找到一种方法来区分内部子查询中具有相同MAX(encargosProveedor.fecha_entrega)值的行(也许用LIMIT 1用另一个值排序),以便查询仅返回一行。