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

Есть таблица:
declare @list table(listid int, i int)

insert into @list(listid, i)
select 1, 1
union
select 1, 2
union
select 2, 3
union
select 2, 4


Есть запрос, который выбирает из этой таблицы какие-то строки по какому-то признаку, например:
select top 3 * from @list as l


Нужно сделать так, чтобы в результирующем запросе остались только те записи, которые полностью выбраны по listid.

Т.е. в примере из трех записей, должны остаться только записи listid = 1.
Как это сделать?
3 дек 14, 11:21    [16942021]     Ответить | Цитировать Сообщить модератору
 Re: Усечь результирующий запрос - если в нем нет всех записей по одному из полей  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 32174
задачкааааааа
Нужно сделать так, чтобы в результирующем запросе остались только те записи, которые полностью выбраны по listid

select *
from (select top 3 * from @list as l) as l
where not exists(select * from @list as t where t.listid = l.listid and t.i <> l.i)
3 дек 14, 11:43    [16942199]     Ответить | Цитировать Сообщить модератору
 Re: Усечь результирующий запрос - если в нем нет всех записей по одному из полей  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 32174
alexeyvg
задачкааааааа
Нужно сделать так, чтобы в результирующем запросе остались только те записи, которые полностью выбраны по listid

select *
from (select top 3 * from @list as l) as l
where not exists(select * from @list as t where t.listid = l.listid and t.i <> l.i)
Не, так просто не получается :-)

;with cte as (select top 3 * from @list as l)
select *
from cte as l
where not exists(
	select * 
	from @list as t 
	where t.listid = l.listid
		and not exists(
			select * from cte c  where c.listid = t.listid and c.i <> t.i
		)
	)
3 дек 14, 11:51    [16942285]     Ответить | Цитировать Сообщить модератору
 Re: Усечь результирующий запрос - если в нем нет всех записей по одному из полей  [new]
LexusR
Member

Откуда: Novosibirsk
Сообщений: 1887
;with s1 as (select top 3 * from @list as l)
,s2 as (select listid, COUNT(*) as n from s1 group by listid)
,s0 as (select listid, COUNT(*) as n from @list group by listid)
select s1.* from s1
join s2 on s2.listid = s1.listid
join s0 on s0.listid = s1.listid and s2.n =s0.n
3 дек 14, 12:50    [16942798]     Ответить | Цитировать Сообщить модератору
 Re: Усечь результирующий запрос - если в нем нет всех записей по одному из полей  [new]
iap
Member

Откуда: Москва
Сообщений: 47198
То есть надо выбрать 3 случайные записи,
чтобы они чудесным образом были с одним и тем же listid,
да ещё чтобы в таблице других записей с этим listid не было?

Может, надо сформулировать задачу по-человечески?
Нормальным русским языком?
3 дек 14, 12:56    [16942862]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить