当前位置: 首页 > 知识库问答 >
问题:

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

端木志诚
2023-03-14

此查询由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个答案

傅元章
2023-03-14

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

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

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

 类似资料:
  • 问题内容: 桌子: 我的查询: 我收到“ MySQL子查询返回多个行”错误。 我知道此查询可以使用以下查询的解决方法: 然后使用php循环遍历结果并执行以下查询以获取和回显它: 但是我认为可能会有更好的解决方案? 问题答案: 简单的解决方法是在子查询中添加一个子句: 一个更好的选择(就性能而言)是使用联接:

  • 我正在运行这样一个简单的SQL连接和select,但在运行查询时,我遇到了非常奇怪的错误。 警告:mysqli_fetch_array()希望参数1是mysqli_结果,布尔值在第23行的C:\xampp\htdocs\Webmaster\run\forum_mc.php中给出 警告:mysqli_query():第24行()上C:\xampp\htdocs\Webmaster\run\forum

  • 问题内容: 我正在执行此查询: 我正在尝试使其返回如下内容: 但是,我得到了错误: #1242-子查询返回的行数超过1。 我尝试将语句放置在子查询中,但是收到无效的语法错误。 问题答案: 您可以使用简单的分组方式在没有子查询的情况下进行尝试: 使用GROUP BY时,未分组的任何列都必须具有聚合子句(fe SUM或COUNT。)因此,在这种情况下,您必须对县名称,precienct.id和prec

  • 问题内容: 我的查询导致以下错误: 消息512,级别16,状态1,过程Item_insupd,第17行 子查询返回了多个值。当子查询遵循=,!=,<,<=,>,> =或将子查询用作表达式时,不允许这样做。 询问: 我怀疑这种情况的发生是因为我的子查询不包含,但是不幸的是,我不知道如何构造正确的子句。 问题答案: 我怀疑问题出在此字符串中(您的代码中的第26行): 看起来像返回多个行,所以您遇到了错

  • 问题内容: 以下查询应返回从动漫中扮演角色的人物的姓名。但我收到以下错误: Blockquote ORA-01427:单行子查询返回多个行 提前致谢! 问题答案: 代替 使用 查询中有5个条件需要更改。 UPD 另外,您的查询等同于

  • 问题内容: 我运行以下查询: 我收到以下错误: 消息512,级别16,状态1,行2子查询返回的值大于1。当子查询遵循=,!=,<,<=,>,> =或将子查询用作表达式时,这是不允许的。 有任何想法吗? 问题答案: 试试这个: 这将返回除列之外相同的多行。查看返回的不同成本值,并找出导致这些不同值的原因。然后询问某人他们想要哪个成本值,然后将条件添加到查询中以选择该成本。