Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / как заменить LEFT JOIN на EXIST ? / 25 сообщений из 54, страница 1 из 3
13.11.2002, 09:37:12
    #32067269
Snark
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как заменить LEFT JOIN на EXIST ?
как переписать данный запрос используя 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
13.11.2002, 09:44:52
    #32067271
YuriAM
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как заменить LEFT JOIN на EXIST ?
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
13.11.2002, 09:51:16
    #32067273
Тимур
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как заменить LEFT JOIN на EXIST ?
Попробуй так:
Код: 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
13.11.2002, 10:12:15
    #32067286
Snark
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как заменить LEFT JOIN на EXIST ?
to Timur :
вот как раз проверки на NULL и хотелось бы избежать.
Так как с использованием LEFT JOIN проходится делат проверку на NULL, что,
как я понимаю блокирует использование индекса при поиске по полю C.Name,
и, соответственно, уменьшает производительность запроса.
...
Рейтинг: 0 / 0
13.11.2002, 10:26:09
    #32067297
Snark
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как заменить LEFT JOIN на EXIST ?
Кстати комментарий к варианту Тимура -
при LEFT JOIN - NULL появляется для теx записей в R таблице
которым нет соответствуюших записей в таблице C, следовательно,
C.Name не может быть NULL когда C.ID = R.ID
Более того, NULL значения для поля Name в таблице C не разрешены
...
Рейтинг: 0 / 0
13.11.2002, 10:33:06
    #32067301
MiCe
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как заменить LEFT JOIN на EXIST ?
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
13.11.2002, 10:39:20
    #32067304
Snark
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как заменить LEFT JOIN на EXIST ?
И наконец формулировка задачи, что видимо необходимо было сделать с самого начала :)
найти все R.ID в Таблице R для которых нет соответствуюших записей в таблице C,
ПЛЮС для которых есть соответствуюшие записи в таблице C И значение C.NAME поля = 123

Кстати, сам я как раз пришел к такому же варианты что и MiCe, но выглядит ето как то
громоздко (2 вложенных запроса), поетому решил проверить себя здесь, спасибо за обсуждение
...
Рейтинг: 0 / 0
13.11.2002, 10:46:16
    #32067306
MiCe
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как заменить LEFT JOIN на EXIST ?
преимущество с exists...
сравни скорость... особенно если таблицы большие....
если с outer строится пересечение таблиц то с exists толко проверяется....
...
Рейтинг: 0 / 0
13.11.2002, 10:47:50
    #32067307
Flint-San
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как заменить LEFT JOIN на EXIST ?
Непонимаю предыдущие ответы. Разве они возвращают то, чего добился автор 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
13.11.2002, 10:53:07
    #32067311
Flint-San
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как заменить LEFT JOIN на EXIST ?
не успел прочитать ответ MICE
Я предпочел бы вариант MICE
...
Рейтинг: 0 / 0
13.11.2002, 12:56:26
    #32067395
SilencerID
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как заменить LEFT JOIN на EXIST ?
Народ, может я чего не допонимаю?
Чем не устраивает такой запрос:

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
13.11.2002, 13:04:33
    #32067400
MiCe
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как заменить LEFT JOIN на EXIST ?
оператор IN тормоз по сравнению с exists
...
Рейтинг: 0 / 0
13.11.2002, 13:43:55
    #32067434
keystop
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как заменить LEFT JOIN на EXIST ?
MiCe :
интересно а как здесь сработает SELECT TOP 1? это не накладно получиться для каждого потенциального вхождения выбрать все а потом отрезать верхушку?
...
Рейтинг: 0 / 0
13.11.2002, 13:53:53
    #32067444
MiCe
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как заменить LEFT JOIN на EXIST ?
TOP 1 никогда не выберает все.....
сервер ищет первое вхождение....
...
Рейтинг: 0 / 0
13.11.2002, 14:00:21
    #32067453
keystop
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как заменить LEFT JOIN на EXIST ?
MiCe
Я тоже так подозреваю ;) жаль не могу топик найти совсем недавно читал об обратном
...
Рейтинг: 0 / 0
13.11.2002, 14:03:31
    #32067458
VVG_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как заменить LEFT JOIN на EXIST ?
У меня left join отработал в полтора раза быстрее, чем if exists.

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

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


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