Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Exists vs Left Join / 8 сообщений из 8, страница 1 из 1
20.10.2016, 11:20
    #39330443
Exists vs Left Join
Какой способ лучше использовать и в каких случаях лучше не использовать один из них?
Код: plsql
1.
2.
3.
4.
5.
select *
  from account a
  left join services b
    on a.id = b.id_account
 where b.id is null;


или
Код: plsql
1.
2.
3.
4.
5.
select *
  from account a
 where exists (select null
          from services b
         where a.id = b.id_account);
...
Рейтинг: 0 / 0
20.10.2016, 11:24
    #39330447
AlexFF__|
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Exists vs Left Join
Гость_Форума_212,

Лучше использовать тот, который подходит к необходимой логике запроса, соответственно, если ни один из них не подходит, лучше их не использовать.
...
Рейтинг: 0 / 0
20.10.2016, 11:25
    #39330450
Exists vs Left Join
Гость_Форума_212,

у тебя запрос на LEFT JOIN-е реализует логиrу "NOT exists"

А по теме - если данные в таблицах связаны как один-ко-кмонгим или многие-ко-многим, то результат на LEFT JOIN-е будет выдавать дублирующиеся строки, в отличии от варианта на EXISTS-подзапросе.
...
Рейтинг: 0 / 0
20.10.2016, 11:29
    #39330453
Exists vs Left Join
Добрый Э - Эх,

Да, забыл написать not, уже сам вижу.
Вопрос в том, какую конструкцию правильнее было бы использовать для отсечения, как будет выполняться быстрее и даст меньшую нагрузку.
...
Рейтинг: 0 / 0
20.10.2016, 11:32
    #39330459
Exists vs Left Join
Гость_Форума_212,

Во многом зависит от состава и количества данных, а также от декларированных ограничениях и схемы индексирования.
Но в целом, оптимизатор сам умеет преобразовывать одно в другое через semi join [anti] если оно того стОит.
...
Рейтинг: 0 / 0
20.10.2016, 11:35
    #39330462
Exists vs Left Join
Добрый Э - Эх,

То есть обе записи вполне допустимы, в случае чего стоит ориентировать на контекст. Собственно, нашел хороший ответ тут . Там о том же, о чем и ты, но подробно. Спасибо, этого мне достаточно.
...
Рейтинг: 0 / 0
20.10.2016, 14:24
    #39330665
Maxim Demenko
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Exists vs Left Join
Добрый Э - ЭхГость_Форума_212,
Но в целом, оптимизатор сам умеет преобразовывать одно в другое через semi join [anti] если оно того стОит.
ИМХО , в случае соединения по комбинированному ключу (2 или больше столбца) NOT EXISTS/NOT IN может выполняться как ANTI JOIN, а вариант с LEFT OUTER JOIN ну никак не хочет и результирует в HASH JOIN + FILTER (хотя можно обойти).

Regards

Maxim
...
Рейтинг: 0 / 0
20.10.2016, 14:35
    #39330678
stax..
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Exists vs Left Join
Гость_Форума_212Добрый Э - Эх,

Да, забыл написать not, уже сам вижу.
Вопрос в том, какую конструкцию правильнее было бы использовать для отсечения, как будет выполняться быстрее и даст меньшую нагрузку.
в первом запросе a.*

лично я пишу exists (not exicts) мне так кажется более наглядным

другое дело во что оптимизатор преобразует мой запрос

......
stax
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Exists vs Left Join / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]