提问者:小点点

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


此查询由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文档,但我不明白为什么返回两行会有问题。我试过很多替代方法。

问题出在哪里?


共1个答案

匿名用户

作为select语句的列包含的子查询称为“标量子查询”。标量子查询应该只能生成零行或一行,因为它的值(标量)将放在查询结果集的返回行中,其中只有一个值的空间。因此,如果子查询返回的行数超过单行,则不能直接用作select列。

一种选择是强制它最多生成一行,可以使用诸如max()min()count()等聚合函数。

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