Всегда ли старый синтаксис Oracle для внешних объединений (+) всегда эквивалентен новому синтаксису? - PullRequest
3 голосов
/ 26 октября 2011

Интересно, всегда ли можно переписать LEFT JOIN, используя старый синтаксис Oracle (+).В частности, я попытался выразить следующий запрос, используя (+)

SELECT *
FROM table_1 a
LEFT JOIN table_2 b ON (b.table1_id = a.id AND b.other_field = 'value1')

, но безуспешно.Это вообще возможно?
Спасибо.

Ответы [ 2 ]

7 голосов
/ 27 октября 2011

Я предполагаю, что вы не используете оператор (+) в тесте b.other_field. Это должно работать:

SELECT *
FROM table_1 a, table_2 b 
WHERE b.table1_id(+) = a.id 
AND b.other_field(+) = 'value1'
3 голосов
/ 26 октября 2011

Если я правильно помню, не всегда возможно переписать ANSI-соединение в старом синтаксисе внешнего соединения Oracle, поскольку порядок выполнения может изменить возвращаемые строки.

Что делает "без успеха значит?Вы получили ошибку?Вы ошиблись строками?Вы получили неправильные столбцы?

Левое объединение сохранит все строки в table_1.Основной формой синтаксиса Oracle в старом стиле является декартово произведение с предложением WHERE и токеном «+» на другой таблице.(Это не включает все ваше предложение WHERE. Это преднамеренно.)

SELECT *
FROM table_1 a, table_2 b
WHERE a.id = b.table1_id(+)

См., Например, AskTom .

Для устранения неполадок.,.

Если вы начнете с запроса

SELECT *
FROM table_1 a
LEFT JOIN table_2 b ON (b.table1_id = a.id AND b.other_field = 'value1')

и удалите псевдонимы, у вас будет

SELECT *
FROM table_1
LEFT JOIN table_2 ON (table_2.table1_id = table_1.id AND 
                      table_2.other_field = 'value1')

Есть ли на самом деле столбцы с именами table_2.table1_id и table_1.id?Это работает?

Если проблема не в этом, начните проще.Попробуйте это.

SELECT table_1.id, table_2.table1_id
FROM table_1
INNER JOIN table_2 ON (table_2.table1_id = table_1.id);

Это работает?Затем попробуйте это.

SELECT table_1.id, table_2.table1_id
FROM table_1
LEFT JOIN table_2 ON (table_2.table1_id = table_1.id);

Если это работает, попробуйте добавить оставшуюся часть вашего предложения JOIN.

...