当前位置: 首页 > 面试题库 >

错误:子查询只能返回一列

李胡媚
2023-03-14
问题内容

subquery must return only one column当我尝试运行以下查询时出现错误:

SELECT mat.mat as mat1, sum(stx.total ) as sumtotal1,
  (
    SELECT mat.mat  as mat, sum(stx.total)  as sumtotal
    FROM stx 
      LEFT JOIN mat ON stx.matid = mat.matid
      LEFT JOIN sale ON stx.saleid = sale.id
    WHERE stx.date BETWEEN '2013-05-01' AND '2013-08-31' 
      AND sale.userid LIKE 'A%'
    GROUP BY mat.mat
) AS MyField
FROM stx 
  LEFT JOIN mat ON stx.matid = mat.matid
  LEFT JOIN sale ON stx.saleid = sale.id
WHERE stx.date BETWEEN '2013-05-01' AND '2013-08-31'
  AND sale.userid LIKE 'B%'
GROUP BY mat.mat

是什么导致此错误?


问题答案:

将一个返回多列的子查询放在FROM列表中,然后从中选择。

首先,相关子查询将是一个坏主意。但是,您的查询甚至没有关联,但是 没有关联
(没有链接到外部查询),并且似乎返回了多行。这导致产生笛卡尔积的(可能非常昂贵且荒谬的)交叉连接,可能不是您的(秘密)意图。

看起来您确实想要:

SELECT m1.mat AS mat1, m1.sumtotal AS sumtotal1
      ,m2.mat AS mat2, m2.sumtotal AS sumtotal2
FROM (
   SELECT mat.mat, sum(stx.total) AS sumtotal
   FROM   stx 
   LEFT   JOIN mat ON mat.matid = stx.matid
   LEFT   JOIN sale ON stx.saleid = sale.id
   WHERE  stx.date BETWEEN '2013-05-01' AND '2013-08-31'
   AND    sale.userid LIKE 'A%'
   GROUP  BY mat.mat
   ) m1
JOIN  (
   SELECT mat.mat, sum(stx.total) AS sumtotal
   FROM   stx 
   LEFT   JOIN mat ON mat.matid = stx.matid
   LEFT   JOIN sale ON sale.id = stx.saleid
   WHERE  stx.date BETWEEN '2013-05-01' AND '2013-08-31' 
   AND    sale.userid LIKE 'b%'
   GROUP  BY mat.mat
   ) m2 USING (mat);

两者LEFT JOIN也都是毫无意义的。WHERE条件将一个sale强制为a INNER JOIN。垫子上的那个似乎毫无意义,因为您GROUP BY mat.mat-除非您有兴趣mat IS NULL?(我对此表示怀疑。)

这种情况可能可以进一步简化为:

SELECT m.mat
      ,sum(CASE WHEN s.userid LIKE 'A%' THEN x.total END) AS total_a
      ,sum(CASE WHEN s.userid LIKE 'B%' THEN x.total END) AS total_b
FROM   sale s 
JOIN   stx  x ON x.saleid = s.id
JOIN   mat  m ON m.matid = x.matid
WHERE (s.userid LIKE 'A%' OR s.userid LIKE 'B%')
AND    x.date BETWEEN '2013-05-01' AND '2013-08-31'
GROUP  BY 1;

WHERE根据您的秘密数据类型和索引,可以进一步简化该条件。在dba.SE的相关答案中,提供了大量有关该情况的信息。



 类似资料:
  • 当“事件ID”与“用户ID”匹配时,im会尝试从我的“事件”表中选择所有数据。然而,我得到一个错误1242,子查询返回超过1行。 我理解我的子查询将返回多行,因为一个用户可以参加多个事件。那么我如何使我的查询接受多行呢?

  • 问题内容: 此查询有什么问题? 我有错误 ORA-01427:单行子查询返回多个行 01427。00000-“单行子查询返回多个行” 问题答案: 这是您的查询: 这样使用的子查询称为 标量子查询 。可以在可以使用标量值(即单个值,例如数字或字符串)的地方使用此类子查询。 标量子查询必须满足两个条件: 它最多返回一行。 它返回一列。 您的解决方案很简单,使用以下命令: 或者,在Oracle 12C中

  • 问题内容: 我有一个查询返回多行,而我想将条件设置为这些多行中的一个值的查询,所以基本上我希望子查询看起来像这样: where 返回多行。因此,如果这些行中的值为1,2,3,那么我想将id设置为1或2或3。 问题答案: 当子查询仅返回1值时可以使用。 当子查询返回的值大于1时,您将必须使用: 例如:

  • 我正在实现房间数据库。这是我的POJO类 这是DAO类 在运行我的代码时,我收到以下错误

  • 问题内容: 您好我的查询得到此错误帮助我恢复它 问题答案: 您的RPT_Company_Address表似乎具有给定公司的多个地址。如果这不可能,则应尝试更正数据并修改架构以防止发生这种情况。 另一方面,如果可以有多个地址,则必须确定查询应如何处理它们: 1)您是否要多次列出同一公司行-每个地址一次?如果是这样,请使用将它们全部返回: 2)如果只需要第一个匹配地址,请在与每个公司相对应的第一个匹配

  • 本文向大家介绍Node.js 发生错误时返回查询,包括了Node.js 发生错误时返回查询的使用技巧和注意事项,需要的朋友参考一下 示例 err发生错误时,可以将执行的查询附加到对象上: