此查询由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文档,但我不明白为什么返回两行会出现问题。我尝试了很多替代方法。
问题出在哪里?
答案 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 ...)
还将返回多个行。
您需要找出一种方法来防止外部子查询返回多行,即使内部子查询返回多行,也可能使用MIN
或MAX
之类的聚合函数。另外,您需要找到一种方法来区分内部子查询中具有相同MAX(encargosProveedor.fecha_entrega)
值的行(也许用LIMIT 1
用另一个值排序),以便查询仅返回一行。>