Существующий запрос Синтаксис соединения Oracle против синтаксиса ANSI JOIN - PullRequest
0 голосов
/ 09 июля 2019

Когда я пишу существующий запрос в синтаксисе ORACLE JOIN, как это, он работает нормально, как и ожидалось.

Select * from TableA
where not exists (Select 1 from TableB where TableB.Id = TableA.TableBForeignKeyId)

Когда я пишу его как синтаксис ANSI JOIN, он не работает.

Select * from TableA
where not exists (Select 1 
                      from (TableA 
                            INNER JOIN TableB 
                            on TableA.TableBForeignKeyId = TableB.Id))

В версии ANSI JOIN TableA ведет себя не так, как верхние запросы TableA, поэтому полный запрос не возвращает строк.

Not: в TableA есть только одна строка, котораяне имеет ссылки на TableB.Этот запрос должен возвращать одну строку таблицы A.

Почему ANSI JOIN ведет себя так?

Ответы [ 2 ]

0 голосов
/ 09 июля 2019

Два запроса совсем не похожи.

Первый - это коррелированный подзапрос .Условие WHERE относится к внешнему запросу.

Вторым является некоррелированный подзапрос .Нет связи с внешним запросом.В этом случае подзапрос возвращает одно значение, независимое от внешнего запроса.Если он не возвращает строк, тогда общий запрос не возвращает строк.Если он возвращает одну или несколько строк, то общий запрос возвращает несколько строк.

Оба допустимы, правильный синтаксис.Вы должны использовать тот, который вы хотите, который обычно будет коррелированным подзапросом.

0 голосов
/ 09 июля 2019

Синтаксис, который вы написали в первом запросе, хорош: т.е.

Select * from TableA
where not exists (Select 1 from TableB where TableB.Id = TableA.TableBForeignKeyId)

Во втором запросе TableA внутреннего запроса не будет ссылаться на внешнюю TableA и, следовательно, вы не получите желаемый результат.результат.

  • Почему вас не устраивает первый запрос?

Если вы ищете какой-то другой способ написания запроса, вы можете использовать следующий запрос:

Select * from TableA
where TableA.TableBForeignKeyId not in (Select TableB.Id 
                      from TableB )

Ура !!

...