powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / как заменить LEFT JOIN на EXIST ?
25 сообщений из 54, страница 1 из 3
как заменить LEFT JOIN на EXIST ?
    #32067269
Snark
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
как переписать данный запрос используя EXIST вместо JEFT JOIN ?
Код: plaintext
1.
2.
3.
4.
SELECT R.ID
FROM R LEFT OUTER JOIN
    C ON R.ID = C.ID
WHERE (C.Name IS NULL OR C.Name =  123 )


Regards, Snark
...
Рейтинг: 0 / 0
как заменить LEFT JOIN на EXIST ?
    #32067271
YuriAM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SELECT R.ID
FROM R
WHERE R.ID IN ( SELECT C.ID FROM C WHERE
C.Name IS NULL OR C.Name = 123 )

Только здесь не учтен OUTER
...
Рейтинг: 0 / 0
как заменить LEFT JOIN на EXIST ?
    #32067273
Фотография Тимур
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробуй так:
Код: plaintext
1.
2.
3.
SELECT R.ID
FROM R 
WHERE exists (Select  1  from C where (C.Name is null or C.Name =  123 ) and (C.ID = R.ID))
...
Рейтинг: 0 / 0
как заменить LEFT JOIN на EXIST ?
    #32067286
Snark
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
to Timur :
вот как раз проверки на NULL и хотелось бы избежать.
Так как с использованием LEFT JOIN проходится делат проверку на NULL, что,
как я понимаю блокирует использование индекса при поиске по полю C.Name,
и, соответственно, уменьшает производительность запроса.
...
Рейтинг: 0 / 0
как заменить LEFT JOIN на EXIST ?
    #32067297
Snark
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати комментарий к варианту Тимура -
при LEFT JOIN - NULL появляется для теx записей в R таблице
которым нет соответствуюших записей в таблице C, следовательно,
C.Name не может быть NULL когда C.ID = R.ID
Более того, NULL значения для поля Name в таблице C не разрешены
...
Рейтинг: 0 / 0
как заменить LEFT JOIN на EXIST ?
    #32067301
Фотография MiCe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SELECT R.ID
FROM R
WHERE EXISTS(SELECT top 1 from C where R.ID=C.ID AND C.Name = 123) OR NOT EXISTS(SELECT top 1 from C where R.ID=C.ID )
...
Рейтинг: 0 / 0
как заменить LEFT JOIN на EXIST ?
    #32067304
Snark
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И наконец формулировка задачи, что видимо необходимо было сделать с самого начала :)
найти все R.ID в Таблице R для которых нет соответствуюших записей в таблице C,
ПЛЮС для которых есть соответствуюшие записи в таблице C И значение C.NAME поля = 123

Кстати, сам я как раз пришел к такому же варианты что и MiCe, но выглядит ето как то
громоздко (2 вложенных запроса), поетому решил проверить себя здесь, спасибо за обсуждение
...
Рейтинг: 0 / 0
как заменить LEFT JOIN на EXIST ?
    #32067306
Фотография MiCe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
преимущество с exists...
сравни скорость... особенно если таблицы большие....
если с outer строится пересечение таблиц то с exists толко проверяется....
...
Рейтинг: 0 / 0
как заменить LEFT JOIN на EXIST ?
    #32067307
Flint-San
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Непонимаю предыдущие ответы. Разве они возвращают то, чего добился автор LEFT OUTER JOIN?
Предлагаю свой вариант:

SELECT R.ID
FROM C INNER JOIN R ON C.ID=R.ID
WHERE C.Name = 123
UNION ALL
SELECT R.ID
FROM
R
WHERE
0=(SELECT count(C.ID) FROM C WHERE C.ID=R.ID)
...
Рейтинг: 0 / 0
как заменить LEFT JOIN на EXIST ?
    #32067311
Flint-San
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
не успел прочитать ответ MICE
Я предпочел бы вариант MICE
...
Рейтинг: 0 / 0
как заменить LEFT JOIN на EXIST ?
    #32067395
SilencerID
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Народ, может я чего не допонимаю?
Чем не устраивает такой запрос:

SELECT R.ID
FROM R
WHERE R.ID IN
(SELECT C.ID FROM C WHERE C.NAME=123) OR
R.ID NOT IN
(SELECT C.ID FROM C)

IMHO, проверок меньше, условия соблюдены -> скорость выше...
Может я не прав?
...
Рейтинг: 0 / 0
как заменить LEFT JOIN на EXIST ?
    #32067400
Фотография MiCe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
оператор IN тормоз по сравнению с exists
...
Рейтинг: 0 / 0
как заменить LEFT JOIN на EXIST ?
    #32067434
keystop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MiCe :
интересно а как здесь сработает SELECT TOP 1? это не накладно получиться для каждого потенциального вхождения выбрать все а потом отрезать верхушку?
...
Рейтинг: 0 / 0
как заменить LEFT JOIN на EXIST ?
    #32067444
Фотография MiCe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TOP 1 никогда не выберает все.....
сервер ищет первое вхождение....
...
Рейтинг: 0 / 0
как заменить LEFT JOIN на EXIST ?
    #32067453
keystop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MiCe
Я тоже так подозреваю ;) жаль не могу топик найти совсем недавно читал об обратном
...
Рейтинг: 0 / 0
как заменить LEFT JOIN на EXIST ?
    #32067458
Фотография VVG_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня left join отработал в полтора раза быстрее, чем if exists.

Таблички по несколько тысяч записей, имеются индексы по R.ID и C.ID.
...
Рейтинг: 0 / 0
как заменить LEFT JOIN на EXIST ?
    #32067464
keystop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я тоже чего-то не понимаю (
создал r и c по 10000 и left join отработал за 30ms а exists все 110 ((( Прокоментируйте плз
...
Рейтинг: 0 / 0
как заменить LEFT JOIN на EXIST ?
    #32067470
Genady
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
создал r и c по 10000 и left join отработал за 30ms а exists все 110 ((( Прокоментируйте плз
А просто все, при джоине один запрос с фильтром, а при использовании exists получаем один запрос с подзапросами равным по количеству строкам основного запроса.
...
Рейтинг: 0 / 0
как заменить LEFT JOIN на EXIST ?
    #32067483
Фотография MiCe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а скриптик?.... а что у вас в c.name?
а поднимите количество записей хотя бы до 1000000
...
Рейтинг: 0 / 0
как заменить LEFT JOIN на EXIST ?
    #32067485
keystop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
т.е. результат будет виден на таблицах с гораздо большим обемом?
...
Рейтинг: 0 / 0
как заменить LEFT JOIN на EXIST ?
    #32067489
Genady
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MiCe, как бы Вам не хотелось, но exists не будет быстрее left join-а. Возьмите для примера оба варианта и посмотрите их планы выполнения, сразу все станет понятно.
...
Рейтинг: 0 / 0
как заменить LEFT JOIN на EXIST ?
    #32067494
Фотография MiCe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вот блин.... я сам пользуюсь внешними объединениями....
но вот иногда... приходится извращатся....
смотреть на данные надо...
если б все таблицы только из ключей и состояли... ;))
...
Рейтинг: 0 / 0
как заменить LEFT JOIN на EXIST ?
    #32067500
Genady
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если б все таблицы только из ключей и состояли... ;))

А причем здесь ключи? Сами прикиньте что проще, выбрать данные и отфильтровать или сделать по каждой проверке запрос, пусть даже он и прерывается при первом совпадении.
...
Рейтинг: 0 / 0
как заменить LEFT JOIN на EXIST ?
    #32067504
Фотография MiCe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
угу.... у меня один раз лога в temdb не хватило...
на одно такое внешнее объединение ... при чем одна таблица своя а другая вообще из внешнего источника...
...
Рейтинг: 0 / 0
как заменить LEFT JOIN на EXIST ?
    #32067511
Genady
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
на одно такое внешнее объединение ... при чем одна таблица своя а другая вообще из внешнего источника...
Еденичные исключения не являются правилом, не так ли?
А Вы уже товарисчам нарассказывали... ;-)
...
Рейтинг: 0 / 0
25 сообщений из 54, страница 1 из 3
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / как заменить LEFT JOIN на EXIST ?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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