Oracle не работает - PullRequest
       24

Oracle не работает

1 голос
/ 18 января 2011

Я пытаюсь получить все коды и реквизиты 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 Ответ

4 голосов
/ 18 января 2011

В сложном выражении внешнего соединения вы должны поместить оператор (+) во все соответствующие столбцы, например:

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 
...