powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / как впихнуть в IN два поля? WHERE a,b NOT IN (select a,b from t)
12 сообщений из 12, страница 1 из 1
как впихнуть в IN два поля? WHERE a,b NOT IN (select a,b from t)
    #39977140
qqq_2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день.

Скажите, как можно сдеать запрос с IN по двум полям?

Код: sql
1.
SELECT * FROM t1  WHERE a,b NOT IN (select a,b from t2)



Ну и возможно ли это в принципе?

Может быть как-то через джоин можно сделать?
...
Рейтинг: 0 / 0
как впихнуть в IN два поля? WHERE a,b NOT IN (select a,b from t)
    #39977147
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
SELECT * FROM t1 WHERE not exists (select * from t2 where t1.a = t2.a and t1.b = t2.b )
...
Рейтинг: 0 / 0
как впихнуть в IN два поля? WHERE a,b NOT IN (select a,b from t)
    #39977151
Фотография a_voronin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гавриленко Сергей Алексеевич,

А разве так писать не является более кошерным?

Код: sql
1.
2.
3.
SELECT t1.* FROM t1 
LEFT JOIN t2 ON t1.a = t2.a and t1.b = t2.b
WHERE t2.a IS NULL 



Или Exists лучше по производительности ?
...
Рейтинг: 0 / 0
как впихнуть в IN два поля? WHERE a,b NOT IN (select a,b from t)
    #39977168
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
a_voronin,

надо сравнивать планы запроса.
...
Рейтинг: 0 / 0
как впихнуть в IN два поля? WHERE a,b NOT IN (select a,b from t)
    #39977269
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
a_voronin

Или Exists лучше по производительности ?

Exists не быстрее и не медленнее, но ПОНЯТНЕЕ.
...
Рейтинг: 0 / 0
как впихнуть в IN два поля? WHERE a,b NOT IN (select a,b from t)
    #39977280
uaggster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
aleks222
a_voronin

Или Exists лучше по производительности ?

Exists не быстрее и не медленнее, но ПОНЯТНЕЕ.

Строго говоря, наверное, может быть быстрее.
Т.к. в случае left join сервер должен будет произвести соединение 2х наборов записей целиком, а во втором случае - лишь убедиться, что во втором наборе существует указанная комбинация.
И не факт, что в первом случае сервер додумается редуцировать выборку.
Ну, в простом случае то, наверное, сумеет, а вот чуть в сторону - может и нет.

Где то встречал совет, использовать exists в сабжевых случаях так часто, как это возможно, именно с целью повышения производительности.
...
Рейтинг: 0 / 0
как впихнуть в IN два поля? WHERE a,b NOT IN (select a,b from t)
    #39977281
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
a_voronin,

Джойны хорошо размножаются, а экзисты хорошо сикаются
...
Рейтинг: 0 / 0
как впихнуть в IN два поля? WHERE a,b NOT IN (select a,b from t)
    #39977291
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
uaggster
aleks222
пропущено...

Exists не быстрее и не медленнее, но ПОНЯТНЕЕ.

Строго говоря, наверное, может быть быстрее.
Т.к. в случае left join сервер должен будет произвести соединение 2х наборов записей целиком, а во втором случае - лишь убедиться, что во втором наборе существует указанная комбинация.
И не факт, что в первом случае сервер додумается редуцировать выборку.
Ну, в простом случае то, наверное, сумеет, а вот чуть в сторону - может и нет.

Где то встречал совет, использовать exists в сабжевых случаях так часто, как это возможно, именно с целью повышения производительности.


Иллюзии это. Мифы и легенды.
Официально exists реализуется сервером через join.
...
Рейтинг: 0 / 0
как впихнуть в IN два поля? WHERE a,b NOT IN (select a,b from t)
    #39977318
msLex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
env
Джойны хорошо размножаются

Что джойны делают?
...
Рейтинг: 0 / 0
как впихнуть в IN два поля? WHERE a,b NOT IN (select a,b from t)
    #39977319
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aleks222
Иллюзии это. Мифы и легенды.
Вроде умный человек, а думать ну никак не хочет...
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
use tempdb;
go

create table dbo.t1 (id int primary key, a int);
create table dbo.t2 (id int identity primary key, t1_id int not null, b int);

insert into dbo.t1 values (1, 1);

insert into dbo.t2
 (t1_id, b)
 select top (2000000)
  1, 2
 from
  master.dbo.spt_values a cross join
  master.dbo.spt_values b;
go

set statistics time, io on;
go

select
 t1.*
from
 dbo.t1 t1 left join
 dbo.t2 t2 on t2.t1_id = t1.id
where
 t2.t1_id is null
option
 (maxdop 1);

select
 t1.*
from
 dbo.t1 t1 
where
 not exists(select 1 from dbo.t2 t2 where t2.t1_id = t1.id)
option
 (maxdop 1);
go

set statistics time, io off;
go

drop table dbo.t1, dbo.t2;
go


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
(0 rows affected)
Table 't2'. Scan count 1, logical reads 5215, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 't1'. Scan count 1, logical reads 2, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

 SQL Server Execution Times:
   CPU time = 172 ms,  elapsed time = 174 ms.

(0 rows affected)
Table 't2'. Scan count 1, logical reads 3, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 't1'. Scan count 1, logical reads 2, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

 SQL Server Execution Times:
   CPU time = 0 ms,  elapsed time = 0 ms.
...
Рейтинг: 0 / 0
как впихнуть в IN два поля? WHERE a,b NOT IN (select a,b from t)
    #39977526
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm
aleks222
Иллюзии это. Мифы и легенды.
Вроде умный человек, а думать ну никак не хочет...

Ну шо ты своими примерами тычешь?
Бесполезная это вещЪ.
Либо через join, либо надо разжувать "через какое чудо".
...
Рейтинг: 0 / 0
как впихнуть в IN два поля? WHERE a,b NOT IN (select a,b from t)
    #39977529
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aleks222
Бесполезная это вещЪ.
Это точно. Для тех, кто мозг не любит включать.
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / как впихнуть в IN два поля? WHERE a,b NOT IN (select a,b from t)
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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