如何查找主表中具有相同记录的所有行?

时间:2016-03-18 10:43:53

标签: sql-server

我需要在TableA中找到TableB中具有相同子记录的每条记录

例如:

TABLEA
科亚
1
2
3

tableB的
科亚.... KEYB .... VALUEB
1 ........... 11 ........... 4
1 ........... 12 ........... 5
2 ........... 21 ........... 4
2 ........... 22 ........... 5
3 ........... 31 ........... 4
3 ........... 32 ........... 6

所以假设我想搜索双打 它应返回tableA中的两个第一行,因为这两行在tableB中具有相同数量的子记录,其值为valueB

tableA中的第一行为2个子记录,一个值为valueB = 4,另一个值为valueB = 5 tableA中的第二行也有2个子记录,并且在字段表B中具有相同的值 第三行还有2个子记录,但字段值B

中的值不同

因此,如果我搜索双打,则应返回tableA中的2个第一行。

我尝试了这个,但它在第一个子查询上出错,它可能不会返回多个值:

select *
from   tableA t1
where  (select t2.valueB 
        from   tableB t2
        where  t2.keyA = 1
       )
       in 
       (select t3.valueB 
        from   tableB t3
        where  t3.keyA = t1.KeyA
       )  

那么,这可以吗?

编辑:我的例子的输出应该是
表A
科亚
1
2

编辑2:重述问题:
1. tableB是tableA的子表 2. tableA中有记录,其中tableB中的记录与字段valueB的值相同,与表A中的其他记录相同 我想找到这些记录。

编辑:到目前为止的调查结果:

这个查询似乎产生了我需要的东西:

declare @keyA int = 1

select distinct r.keyA
from   tableA r
  inner join tableB eb on r.keyA = eb.keyA
where  (select count(1) from tableB eb1 where eb1.keyA = @keyA) = (select count(1) from tableB eb2 where eb2.keyA = r.keyA)
and    eb.valueB in (select eb4.valueB from tableB eb4 where eb4.keyA = @keyA)

第一个where子句仅允许主记录,其中子记录的数量与tableA中的第一行相同。 (找到tableA中的所有行)
第二个where子句仅允许主记录,其中子记录的valueB也出现在tableA中第一行的子记录中。 (只找到tableA中的前两行)

这个想法是获取与第一行具有相同数量的子记录的所有主记录(tableA),并且这些子记录中valueB的所有值也出现在第一行的子记录中。 TABLEA。
在哪里合并的条款应该给我我需要的东西,这就是我所希望的。

它似乎产生了正确的结果,但我想要一些确认,如果它的正确或错误。

1 个答案:

答案 0 :(得分:0)

select 
t1.A
from
t1
where exists(
           select 1 from t2 where t2.keya=t1.keya 
           group by t2.keya,t2.valueb
           having count(*)>1
            )