Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 поиск по совпадению нескольких записей  [new]
tregish
Guest
create table #test (
  idA         int,
  idB         int)

insert #test values(1, 1)
insert #test values(1, 2)
insert #test values(1, 3)
insert #test values(2, 2)
insert #test values(2, 3)
insert #test values(4, 1)
insert #test values(4, 2)
insert #test values(4, 3)

Нужно найти все idA, полностью совпадающие по полю idB. Например, для тестовой базы выше, для idA=1 это будет idA=4
Как это сделать без курсора?
9 ноя 09, 13:49    [7901541]     Ответить | Цитировать Сообщить модератору
 Re: поиск по совпадению нескольких записей  [new]
tregish
Guest
Microsoft SQL Server 2000 - 8.00.2055 (Intel X86) Dec 16 2008 19:46:53 Copyright (c) 1988-2003 Microsoft Corporation Enterprise Edition on Windows NT 5.2 (Build 3790: Service Pack 2)
9 ноя 09, 13:54    [7901591]     Ответить | Цитировать Сообщить модератору
 Re: поиск по совпадению нескольких записей  [new]
aleks2
Guest
declare @t table(
  idA         int,
  idB         int)

insert @t values(1, 1)
insert @t values(1, 2)
insert @t values(1, 3)
insert @t values(2, 2)
insert @t values(2, 3)
insert @t values(4, 1)
insert @t values(4, 2)
insert @t values(4, 3)

select * from @t

select X.idA
FROM
(select idA, count(*) Cnt FROM @t GROUP BY idA) X
INNER JOIN
(select idA, count(*) Cnt FROM @t GROUP BY idA) Y
ON X.Cnt=Y.Cnt AND X.idA<>Y.idA
WHERE
exists(select * FROM @t A inner join @t B ON A.idB=B.idB WHERE A.idA=X.idA AND  B.idA=Y.idA GROUP BY A.idA,B.idA HAVING count(*)=X.Cnt)
9 ноя 09, 14:13    [7901788]     Ответить | Цитировать Сообщить модератору
 Re: поиск по совпадению нескольких записей  [new]
Anddros
Member

Откуда:
Сообщений: 1077
Тупо в лоб:
select t1.idA, t2.idA
from (select distinct idA from #test) t1
inner join (select distinct idA from #test) t2 on t1.idA<t2.idA
where not exists (select * from #test t3 left join #test t4 on t3.idB=t4.idB and t4.idA=t2.idA where t3.idA=t1.idA and t4.idB is null)
and not exists (select * from #test t3 left join #test t4 on t3.idB=t4.idB and t4.idA=t1.idA where t3.idA=t2.idA and t4.idB is null)
9 ноя 09, 14:23    [7901899]     Ответить | Цитировать Сообщить модератору
 Re: поиск по совпадению нескольких записей  [new]
aleks2
Guest
Поправка
declare @t table(
  idA         int,
  idB         int)

insert @t values(1, 1)
insert @t values(1, 2)
insert @t values(1, 3)
insert @t values(1, 3)
insert @t values(2, 2)
insert @t values(2, 3)
insert @t values(2, 2)
insert @t values(4, 1)
insert @t values(4, 2)
insert @t values(4, 3)

select * from @t


select X.idA
FROM
(select idA, count(*) Cnt FROM @t GROUP BY idA) X
INNER JOIN
(select idA, count(*) Cnt FROM @t GROUP BY idA) Y
ON X.Cnt=Y.Cnt AND X.idA<>Y.idA
WHERE
exists(select * FROM (select idB, count(*) Cn FROM @t WHERE idA=X.idA GROUP BY idB) A 
               inner join 
	(select idB, count(*) Cn FROM @t WHERE idA=Y.idA GROUP BY idB) B 
ON A.idB=B.idB AND A.cn=B.cn HAVING count(*)=X.Cnt)
9 ноя 09, 15:10    [7902427]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить