这个查询由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文档,但我不明白为什么返回两行有问题。我尝试过很多替代方案。
问题出在哪儿?
包含在SELECT
语句列中的子查询称为“标量子查询”。标量子查询应该只能生成零行或一行,因为它的值(标量)将放置在查询结果集的返回行中,其中只有一个值的空间。因此,如果子查询返回的行数多于一行,则不能直接用作SELECT
列。
一种选择是强制它最多产生一行,也许使用聚合函数,如qazxsw poi,qazxsw poi,qazxsw poi等。
另一种选择是将子查询作为“表表达式”加入,其中对返回的行数没有限制。
评论太久了。
这不是
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
按另一个值排序),以便查询只返回一行。