Oracle не работает
Я пытаюсь получить все коды и реквизиты IFSC (уникальный код банка) от моего банковского мастера, который начинается с первых 4 символов введенного кода IFSC. У меня есть основная таблица банков, которая включает код IFSC (4 символа), соответствующие банковские реквизиты.
Основная часть запроса приведена ниже.
AND D.IFSC_CODE=UPPER(substr(B.BANK_CODE,1,4)) (+) ORDER BY....
Когда я выполняю этот запрос, я получаю сообщение об ошибке "ORA-00936: отсутствует выражение".
Что я ожидаю от запроса:
- вернуть реквизиты, если в основной записи банка есть банк, соответствующий введенному коду IFSC
- иначе только введенный IFSC должен отображать
Когда я переписываю запрос как
AND D.IFSC_CODE(+) =UPPER(substr(B.BANK_CODE,1,4)) ORDER BY....
Нет ошибки, но результат оказался не таким, как я ожидал.
Как я могу решить это?
1 ответ
В сложном выражении внешнего соединения вы бы поместили (+)
оператор на всех соответствующих столбцах, как в:
AND D.IFSC_CODE=UPPER(substr(B.BANK_CODE (+),1,4))
Например:
SQL> WITH table_a AS (
2 SELECT '0001' ID FROM dual
3 UNION ALL SELECT '0002' FROM dual
4 UNION ALL SELECT '0003' FROM dual
5 ), table_b AS (
6 SELECT '0001a' ID FROM dual
7 UNION ALL SELECT '0002b' FROM dual
8 )
9 SELECT a.id, b.id
10 FROM table_a a, table_b b
11 WHERE a.id = substr(b.id (+), 1, 4);
ID ID
---- -----
0001 0001a
0002 0002b
0003
Эта форма внешнего соединения специфична для Oracle и, возможно, более трудна для чтения, чем внешнее соединение SQL ANSI. Кроме того, некоторые старые функции отключаются с помощью этого старого метода (полное внешнее соединение, внешнее соединение с несколькими таблицами). В форме соединения SQL и запроса запрос будет выглядеть следующим образом:
SQL> WITH table_a AS (
2 SELECT '0001' ID FROM dual
3 UNION ALL SELECT '0002' FROM dual
4 UNION ALL SELECT '0003' FROM dual
5 ), table_b AS (
6 SELECT '0001a' ID FROM dual
7 UNION ALL SELECT '0002b' FROM dual
8 )
9 SELECT a.id, b.id
10 FROM table_a a
11 LEFT OUTER JOIN table_b b ON a.id = substr(b.id, 1, 4);
ID ID
---- -----
0001 0001a
0002 0002b
0003