Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 заменить NOT IN на JOIN  [new]
Sv219
Member

Откуда: Омск
Сообщений: 976
имеется 2 таблицы (t1 и t2),

нужно выбрать знаяения из t1 которых нету в t2

select * from t1
where t1.id Not In (Select t1-id From t2)

но насколько помню NOT IN тут можно заменить на JOIN и будет быстрее.
как можно заменить NOT IN ?
20 дек 07, 15:33    [5075558]     Ответить | Цитировать Сообщить модератору
 Re: заменить NOT IN на JOIN  [new]
Al_B
Member

Откуда:
Сообщений: 478
Sv219
имеется 2 таблицы (t1 и t2),

нужно выбрать знаяения из t1 которых нету в t2

select * from t1
where t1.id Not In (Select t1-id From t2)

но насколько помню NOT IN тут можно заменить на JOIN и будет быстрее.
как можно заменить NOT IN ?

ну разве что типа
select t.f1
from (select t1.f1, t2.f2, ...
from t1 left outer join t2 on t1.id=t2.[t1-id] --это у вас название поля такое в таблице? ЖУТЬ. Или опечатка?
) t
where t.f2 is null

где t2.f2 - любое заведомо непустое поле....
но не верен, что это будет быстрее... Сравните планы выполнения....
а выглядит IMHO горрразо страшнее... или же мне просто дурацкий запрос на ум пришел...
20 дек 07, 15:42    [5075641]     Ответить | Цитировать Сообщить модератору
 Re: заменить NOT IN на JOIN  [new]
Sv219
Member

Откуда: Омск
Сообщений: 976
Al_B
Sv219
имеется 2 таблицы (t1 и t2),

нужно выбрать знаяения из t1 которых нету в t2

select * from t1
where t1.id Not In (Select t1-id From t2)

но насколько помню NOT IN тут можно заменить на JOIN и будет быстрее.
как можно заменить NOT IN ?

ну разве что типа
select t.f1
from (select t1.f1, t2.f2, ...
from t1 left outer join t2 on t1.id=t2.[t1-id] --это у вас название поля такое в таблице? ЖУТЬ. Или опечатка?
) t
where t.f2 is null

где t2.f2 - любое заведомо непустое поле....
но не верен, что это будет быстрее... Сравните планы выполнения....
а выглядит IMHO горрразо страшнее... или же мне просто дурацкий запрос на ум пришел...

спасибо
20 дек 07, 15:44    [5075675]     Ответить | Цитировать Сообщить модератору
 Re: заменить NOT IN на JOIN  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Можно ещё для SQL2005 (версия ведь неизвестна) вот так:
SELECT * FROM t1 WHERE id IN  (SELECT id FROM t1 EXCEPT SELECT [t1-id] FROM t2)
20 дек 07, 16:25    [5076172]     Ответить | Цитировать Сообщить модератору
 Re: заменить NOT IN на JOIN  [new]
Le Peace
Member

Откуда: Москва
Сообщений: 8969
Не так рази?
select t1.* 
from t1 
left join t2
	on t1.id = t2.[t1-id]
where t2.[t1-id] is null
20 дек 07, 16:36    [5076284]     Ответить | Цитировать Сообщить модератору
 Re: заменить NOT IN на JOIN  [new]
Sv219
Member

Откуда: Омск
Сообщений: 976
да версия 2005.

а какой способ лучше с точки зрения произвродительности?
20 дек 07, 16:54    [5076537]     Ответить | Цитировать Сообщить модератору
 Re: заменить NOT IN на JOIN  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Le Peace
Не так рази?
select t1.* 
from t1 
left join t2
	on t1.id = t2.[t1-id]
where t2.[t1-id] is null
Это уже предлагали
20 дек 07, 16:59    [5076595]     Ответить | Цитировать Сообщить модератору
 Re: заменить NOT IN на JOIN  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Sv219
да версия 2005.

а какой способ лучше с точки зрения произвродительности?
Смотрите план выполнения
20 дек 07, 17:00    [5076602]     Ответить | Цитировать Сообщить модератору
 Re: заменить NOT IN на JOIN  [new]
msLex
Member

Откуда:
Сообщений: 9273
Le Peace
Не так рази?
select t1.* 
from t1 
left join t2
	on t1.id = t2.[t1-id]
where t2.[t1-id] is null

если t1 - t2 связаны 1 к n то вы получите замножение записей t1
20 дек 07, 17:04    [5076651]     Ответить | Цитировать Сообщить модератору
 Re: заменить NOT IN на JOIN  [new]
msLex
Member

Откуда:
Сообщений: 9273
msLex
Le Peace
Не так рази?
select t1.* 
from t1 
left join t2
	on t1.id = t2.[t1-id]
where t2.[t1-id] is null

если t1 - t2 связаны 1 к n то вы получите замножение записей t1

нечитать :(
20 дек 07, 17:05    [5076656]     Ответить | Цитировать Сообщить модератору
 Re: заменить NOT IN на JOIN  [new]
Le Peace
Member

Откуда: Москва
Сообщений: 8969
iap
Le Peace
Не так рази?
select t1.* 
from t1 
left join t2
	on t1.id = t2.[t1-id]
where t2.[t1-id] is null
Это уже предлагали

Ну там вложенный запрос лишний, поэтому я и уточнил.
20 дек 07, 17:38    [5076954]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: заменить NOT IN на JOIN  [new]
maybe_this_login_is_not_busy
Member

Откуда:
Сообщений: 31
NOT IN vs. NOT EXISTS vs. LEFT JOIN / IS NULL
5 сен 11, 14:32    [11228552]     Ответить | Цитировать Сообщить модератору
 Re: заменить NOT IN на JOIN  [new]
Le Peace
Member

Откуда: Москва
Сообщений: 8969
maybe_this_login_is_not_busy
NOT IN vs. NOT EXISTS vs. LEFT JOIN / IS NULL

Ничего, что там про MySQL?
5 сен 11, 14:49    [11228737]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить