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

问题描述 投票:0回答:2

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

问题出在哪儿?

mysql django database subquery django-orm
2个回答
1
投票

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

一种选择是强制它最多产生一行,也许使用聚合函数,如qazxsw poi,qazxsw poi,qazxsw poi等。

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


0
投票

评论太久了。

这不是

MAX()

子查询是问题所在。因为这是MIN()表达式的一部分,所以允许返回多行。但是,因为它返回多个行,所以周围的子查询:

COUNT()

也将返回多行。

您需要找到一种方法来防止外部子查询返回多行,即使内部子行也可以返回,可能是通过使用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 ...) 值的行(可能使用MIN按另一个值排序),以便查询只返回一行。

© www.soinside.com 2019 - 2024. All rights reserved.