我需要在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。
在哪里合并的条款应该给我我需要的东西,这就是我所希望的。
它似乎产生了正确的结果,但我想要一些确认,如果它的正确或错误。
答案 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
)