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

Откуда:
Сообщений: 90
Доброе утро всем!
Таблица t1 связана с t2 как один-ко-многим по t2.t1_id.
SELECT
    t1.id
  , t2.id
  , t2.t1_id
  , t2.field

FROM
    t1
  , t2

WHERE
	t1.id = t2.t1_id
	-- t2.field is null

результат такой:
t1.id, t2.id, t2.t1_id, t2.f

1, 1, 1, null
1, 2, 1, 16-11-2017
1, 3, 1, null

2, 4, 2, null
2, 5, 2, null
2, 6, 2, null

3, 7, 3, null
3, 8, 3, null
3, 9, 3, 15-10-2017

Подскажите, как выбрать записи, таблиц t1, t2 в которых t2.field is null во всех записях t2.field ?
То есть, из приведенного примера результат запроса должен выдать только:
2, 4, 2, null
2, 5, 2, null
2, 6, 2, null

так как у записи t1.id = 1 есть t2.field = 16-11-2017,
а у записи t1.id = 3 есть t2.field = 15-10-2017.
16 ноя 17, 07:06    [20958420]     Ответить | Цитировать Сообщить модератору
 Re: Исключить из результата  [new]
авторчик_161117
Guest
declare @t1 table (id int)
declare @t2 table (id int, t1_id int, f date)

insert @t1 values (1)
insert @t1 values (2)
insert @t1 values (3)

insert @t2 values (1, 1, null)
insert @t2 values (2, 1, '20171116')
insert @t2 values (3, 1, null)
insert @t2 values (4, 2, null)
insert @t2 values (5, 2, null)
insert @t2 values (6, 2, null)
insert @t2 values (7, 3, null)
insert @t2 values (8, 3, null)
insert @t2 values (9, 3, '20171015')


select
  t1.id
 ,t2.id
 ,t2.t1_id
 ,t2.f
from 
  @t1 t1
inner join @t2 t2 on t1.id = t2.t1_id
where t2.t1_id not in (select t1_id from @t2 where f is not null)
16 ноя 17, 07:43    [20958445]     Ответить | Цитировать Сообщить модератору
 Re: Исключить из результата  [new]
iap
Member

Откуда: Москва
Сообщений: 46977
WITH t AS
(
 SELECT id1=t1.id,id2=t2.id,t1_id=t2.t1_id,f1=t1.field,f2=t2.field
 FROM t1 JOIN t2 ON t1.id=t2.t1_id
)
SELECT *
FROM t
WHERE NOT EXISTS(SELECT * FROM t tt WHERE tt.id1=t.id1 AND tt.f2 IS NOT NULL);
16 ноя 17, 08:33    [20958520]     Ответить | Цитировать Сообщить модератору
 Re: Исключить из результата  [new]
Arl
Member

Откуда:
Сообщений: 90
Спасибо большое, разобрался в обеих вариантах.
Подскажите, есть ли разница в скорости работы NOT IN и NOT EXISTS ?
Какой из вариантов будет работать быстрее?
16 ноя 17, 08:55    [20958587]     Ответить | Цитировать Сообщить модератору
 Re: Исключить из результата  [new]
авторчик_161117
Guest
Arl,

в общем случае, если все-таки говорить про коня в вакууме, то exists будет конечно же быстрее
16 ноя 17, 08:58    [20958596]     Ответить | Цитировать Сообщить модератору
 Re: Исключить из результата  [new]
Arl
Member

Откуда:
Сообщений: 90
Ок, понял.
Спасибо большое еще раз за помощь!
16 ноя 17, 09:04    [20958615]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить