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

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

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



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

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

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

Код: 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
07.07.2020, 17:15
    #39977168
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как впихнуть в IN два поля? WHERE a,b NOT IN (select a,b from t)
a_voronin,

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

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

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

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

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

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

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

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

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

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

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


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

Что джойны делают?
...
Рейтинг: 0 / 0
08.07.2020, 10:38
    #39977319
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как впихнуть в IN два поля? WHERE a,b NOT IN (select a,b from t)
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
08.07.2020, 17:41
    #39977526
aleks222
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как впихнуть в IN два поля? WHERE a,b NOT IN (select a,b from t)
invm
aleks222
Иллюзии это. Мифы и легенды.
Вроде умный человек, а думать ну никак не хочет...

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


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