SQL查询中的子查询返回“单行子查询返回多行”?

3
这是我的查询语句:
SELECT TRANS_MSTR.branch_id
  FROM TRANS_MSTR, BRANCH_MSTR
 WHERE BRANCH_MSTR.branch_type_desc = 'ATM ONLY' 
   And ( SELECT SUM(TRANS_MSTR.trans_amount)  
           FROM TRANS_MSTR 
          WHERE TRANS_MSTR.trans_yyyymm = '201511' 
       GROUP BY TRANS_MSTR.branch_id) < 100;

"ORA-01427: 单行子查询返回多行"

这是我遇到的错误。我实际上不知道它的含义是什么?我的查询目标是返回分支ID和总和,其中总和小于100。

当我尝试这样修复它时:

     SELECT TRANS_MSTR.branch_id, 
           (SELECT SUM(TRANS_MSTR.trans_amount) 
              FROM TRANS_MSTR 
             WHERE TRANS_MSTR.trans_yyyymm = '201511' 
          GROUP BY TRANS_MSTR.branch_id) as TransAmt
              FROM TRANS_MSTR, BRANCH_MSTR
             WHERE BRANCH_MSTR.branch_type_desc = 'ATM ONLY' 
               And TransAmt < 100;

它告诉我TRANSAMT是一个无效的标识符。但我以为你可以为子查询设置别名?


你的查询还有其他问题(除了子查询)。你正在使用过时的隐式 JOIN 语法。此外,你的 JOIN 缺少 ON 子句,因此它实际上是一个 CROSS JOIN - Giorgos Betsos
2个回答

2
我认为你需要一个相关子查询:
SELECT b.branch_id
FROM BRANCH_MSTR b
WHERE b.branch_type_desc = 'ATM ONLY' and
      (SELECT SUM(t.trans_amount)
       FROM TRANS_MSTR t
       WHERE t.trans_yyyymm = '201511' AND
             t.branch_id = b.branch_id
      ) < 100;

我不会这样写查询语句。不过你已经开始使用子查询而不是更传统的JOIN/GROUP BY方法。


2
请尝试以下操作:
    SELECT BRANCH_MSTR.branch_id,  SUM(TRANS_MSTR.trans_amount) 
        AS TransAmt FROM BRANCH_MSTR b
INNER JOIN BRANCH_MSTR 
        ON TRANS_MSTR.branch_id = BRANCH_MSTR.branch_id 
     WHERE BRANCH_MSTR.branch_type_desc = 'ATM ONLY' 
       AND TRANS_MSTR.trans_amount < 100 
       AND TRANS_MSTR.trans_yyyymm = '201511' 
  GROUP BY TRANS_MSTR.branch_id;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接