Вот мой запрос:

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: однострочный подзапрос возвращает более одной строки»

Это ошибка, которую я получаю. Я даже не знаю, что это значит? Общая цель моего запроса - вернуть идентификатор ветки и сумму, где сумма меньше 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 - недопустимый идентификатор. Но я думал, вы можете использовать псевдоним подзапросов?

3
CapnShanty 13 Мар 2018 в 15:39

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;
2
Prabhat Sinha 13 Мар 2018 в 12:57

Я думаю, что вы хотите коррелированный подзапрос:

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
Gordon Linoff 13 Мар 2018 в 12:41