|
|
|
как заменить LEFT JOIN на EXIST ?
|
|||
|---|---|---|---|
|
#18+
как переписать данный запрос используя EXIST вместо JEFT JOIN ? Код: plaintext 1. 2. 3. 4. Regards, Snark ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2002, 09:37:12 |
|
||
|
как заменить LEFT JOIN на EXIST ?
|
|||
|---|---|---|---|
|
#18+
SELECT R.ID FROM R WHERE R.ID IN ( SELECT C.ID FROM C WHERE C.Name IS NULL OR C.Name = 123 ) Только здесь не учтен OUTER ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2002, 09:44:52 |
|
||
|
как заменить LEFT JOIN на EXIST ?
|
|||
|---|---|---|---|
|
#18+
Попробуй так: Код: plaintext 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2002, 09:51:16 |
|
||
|
как заменить LEFT JOIN на EXIST ?
|
|||
|---|---|---|---|
|
#18+
to Timur : вот как раз проверки на NULL и хотелось бы избежать. Так как с использованием LEFT JOIN проходится делат проверку на NULL, что, как я понимаю блокирует использование индекса при поиске по полю C.Name, и, соответственно, уменьшает производительность запроса. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2002, 10:12:15 |
|
||
|
как заменить LEFT JOIN на EXIST ?
|
|||
|---|---|---|---|
|
#18+
Кстати комментарий к варианту Тимура - при LEFT JOIN - NULL появляется для теx записей в R таблице которым нет соответствуюших записей в таблице C, следовательно, C.Name не может быть NULL когда C.ID = R.ID Более того, NULL значения для поля Name в таблице C не разрешены ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2002, 10:26:09 |
|
||
|
как заменить LEFT JOIN на EXIST ?
|
|||
|---|---|---|---|
|
#18+
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 ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2002, 10:33:06 |
|
||
|
как заменить LEFT JOIN на EXIST ?
|
|||
|---|---|---|---|
|
#18+
И наконец формулировка задачи, что видимо необходимо было сделать с самого начала :) найти все R.ID в Таблице R для которых нет соответствуюших записей в таблице C, ПЛЮС для которых есть соответствуюшие записи в таблице C И значение C.NAME поля = 123 Кстати, сам я как раз пришел к такому же варианты что и MiCe, но выглядит ето как то громоздко (2 вложенных запроса), поетому решил проверить себя здесь, спасибо за обсуждение ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2002, 10:39:20 |
|
||
|
как заменить LEFT JOIN на EXIST ?
|
|||
|---|---|---|---|
|
#18+
преимущество с exists... сравни скорость... особенно если таблицы большие.... если с outer строится пересечение таблиц то с exists толко проверяется.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2002, 10:46:16 |
|
||
|
как заменить LEFT JOIN на EXIST ?
|
|||
|---|---|---|---|
|
#18+
Непонимаю предыдущие ответы. Разве они возвращают то, чего добился автор 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) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2002, 10:47:50 |
|
||
|
как заменить LEFT JOIN на EXIST ?
|
|||
|---|---|---|---|
|
#18+
не успел прочитать ответ MICE Я предпочел бы вариант MICE ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2002, 10:53:07 |
|
||
|
как заменить LEFT JOIN на EXIST ?
|
|||
|---|---|---|---|
|
#18+
Народ, может я чего не допонимаю? Чем не устраивает такой запрос: 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, проверок меньше, условия соблюдены -> скорость выше... Может я не прав? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2002, 12:56:26 |
|
||
|
как заменить LEFT JOIN на EXIST ?
|
|||
|---|---|---|---|
|
#18+
оператор IN тормоз по сравнению с exists ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2002, 13:04:33 |
|
||
|
как заменить LEFT JOIN на EXIST ?
|
|||
|---|---|---|---|
|
#18+
MiCe : интересно а как здесь сработает SELECT TOP 1? это не накладно получиться для каждого потенциального вхождения выбрать все а потом отрезать верхушку? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2002, 13:43:55 |
|
||
|
как заменить LEFT JOIN на EXIST ?
|
|||
|---|---|---|---|
|
#18+
TOP 1 никогда не выберает все..... сервер ищет первое вхождение.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2002, 13:53:53 |
|
||
|
как заменить LEFT JOIN на EXIST ?
|
|||
|---|---|---|---|
|
#18+
MiCe Я тоже так подозреваю ;) жаль не могу топик найти совсем недавно читал об обратном ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2002, 14:00:21 |
|
||
|
как заменить LEFT JOIN на EXIST ?
|
|||
|---|---|---|---|
|
#18+
У меня left join отработал в полтора раза быстрее, чем if exists. Таблички по несколько тысяч записей, имеются индексы по R.ID и C.ID. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2002, 14:03:31 |
|
||
|
как заменить LEFT JOIN на EXIST ?
|
|||
|---|---|---|---|
|
#18+
я тоже чего-то не понимаю ( создал r и c по 10000 и left join отработал за 30ms а exists все 110 ((( Прокоментируйте плз ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2002, 14:15:22 |
|
||
|
как заменить LEFT JOIN на EXIST ?
|
|||
|---|---|---|---|
|
#18+
создал r и c по 10000 и left join отработал за 30ms а exists все 110 ((( Прокоментируйте плз А просто все, при джоине один запрос с фильтром, а при использовании exists получаем один запрос с подзапросами равным по количеству строкам основного запроса. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2002, 14:17:45 |
|
||
|
как заменить LEFT JOIN на EXIST ?
|
|||
|---|---|---|---|
|
#18+
а скриптик?.... а что у вас в c.name? а поднимите количество записей хотя бы до 1000000 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2002, 14:25:26 |
|
||
|
как заменить LEFT JOIN на EXIST ?
|
|||
|---|---|---|---|
|
#18+
т.е. результат будет виден на таблицах с гораздо большим обемом? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2002, 14:28:30 |
|
||
|
как заменить LEFT JOIN на EXIST ?
|
|||
|---|---|---|---|
|
#18+
MiCe, как бы Вам не хотелось, но exists не будет быстрее left join-а. Возьмите для примера оба варианта и посмотрите их планы выполнения, сразу все станет понятно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2002, 14:30:36 |
|
||
|
как заменить LEFT JOIN на EXIST ?
|
|||
|---|---|---|---|
|
#18+
вот блин.... я сам пользуюсь внешними объединениями.... но вот иногда... приходится извращатся.... смотреть на данные надо... если б все таблицы только из ключей и состояли... ;)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2002, 14:32:53 |
|
||
|
как заменить LEFT JOIN на EXIST ?
|
|||
|---|---|---|---|
|
#18+
если б все таблицы только из ключей и состояли... ;)) А причем здесь ключи? Сами прикиньте что проще, выбрать данные и отфильтровать или сделать по каждой проверке запрос, пусть даже он и прерывается при первом совпадении. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2002, 14:36:17 |
|
||
|
как заменить LEFT JOIN на EXIST ?
|
|||
|---|---|---|---|
|
#18+
угу.... у меня один раз лога в temdb не хватило... на одно такое внешнее объединение ... при чем одна таблица своя а другая вообще из внешнего источника... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2002, 14:39:24 |
|
||
|
как заменить LEFT JOIN на EXIST ?
|
|||
|---|---|---|---|
|
#18+
на одно такое внешнее объединение ... при чем одна таблица своя а другая вообще из внешнего источника... Еденичные исключения не являются правилом, не так ли? А Вы уже товарисчам нарассказывали... ;-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2002, 14:43:53 |
|
||
|
|

start [/forum/topic.php?fid=46&msg=32067494&tid=1818829]: |
0ms |
get settings: |
10ms |
get forum list: |
18ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
62ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
63ms |
get tp. blocked users: |
2ms |
| others: | 201ms |
| total: | 375ms |

| 0 / 0 |
