Mysql 为什么这个子查询不能返回多行?
此查询由Django ORM使用RawSQL生成:Mysql 为什么这个子查询不能返回多行?,mysql,django,database,subquery,django-orm,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,
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行
这是子查询的结果
我阅读了MYSQL文档,但我不明白为什么返回两行会有问题。我试过很多选择
问题在哪里 包含在SELECT语句列中的子查询称为标量子查询。标量子查询应该只能生成零行或一行,因为它的值标量将被放置在查询结果集的返回行中,其中只有一个值的空间。因此,如果子查询返回的行多于一行,则不能将其直接用作SELECT列 一个选项是强制它最多生成一行,可以使用聚合函数,如MAX、MIN、COUNT等
另一种选择是将子查询作为表表达式联接,其中对返回的行数没有限制。注释太长 这不是问题
SELECT articulos.id, MAX(encargosProveedor.fecha_entrega)
FROM ...
子查询这就是问题所在。因为它是联接表达式的一部分,所以允许它返回多行。但是,由于它返回多行,因此周围的子查询:
SELECT articulos.costo_us * (1 + articulos.iva_coef)
FROM articulos
INNER JOIN (SELECT articulos.id, MAX(encargosProveedor.fecha_entrega)
FROM ...)
还将返回多行
您需要找到一种方法来防止外部子查询返回多行,即使内部子查询返回多行,也可以使用聚合函数,例如MIN或MAX。或者,您需要找到一种方法来区分内部子查询中具有相同MAXENCARGOSPROVEDEOR.fecha_entrega值的行,可能是按另一个限制为1的值排序,以便查询只返回一行。这与您的问题相同:您需要将外部查询中的行与内部查询中的行关联,例如,通过articulos.producto_id=productos.id,或通过连接中间查询:。。。从productos内部联接选择。。。作为ultimo\u precio.producto\u id=productos.id上的ultimo\u precio。显然,您还需要将producto_id从最里面的查询公开到中间的查询。谢谢Endre。是的,在阅读了回复和更多文档后,我发现了相关子查询的概念,并最终对此查询进行了适当的更改。对于有类似问题的查询,我发现一条非常有用的文章是:@Hernan如果你找到了此问题的解决方案,你应该将其作为答案发布并接受它。
SELECT articulos.costo_us * (1 + articulos.iva_coef)
FROM articulos
INNER JOIN (SELECT articulos.id, MAX(encargosProveedor.fecha_entrega)
FROM ...)