如何在master-child表中找到双打?

时间:2016-03-24 10:53:25

标签: sql sql-server

我需要查询帮助才能找到双打。让我们通过例子来解释这种情况:

tableA (主表格)的关键字段keyA包含以下值:

keyA  
1  
2  
3  
etc

tableB (客户端表)有一个外键字段keyA和一个值字段fieldB

keyA  fieldB  
1     a  
1     b  
2     a  
2     b  
3     a  
3     c  
4     a  
4     b  
4     c  
etc  

因此,子表 tableB fieldB的值为:

    {li> for tableA.keyA = 1是: a b {li> for tableA.keyA = 2是: a b {li> for tableA.keyA = 3是: a c {li> for tableA.keyA = 4是: a b c

现在,给定keyA的值,我需要找到 tableA 中的所有记录,这些记录在字段fieldB tableB 中具有匹配的记录。

例如,如果我使用keyA = 1进行搜索,那么

  • tableA.keyA = 2没问题,因为两者都有相同的tableB.fieldB a b a b
  • tableA.keyA = 3不合适,因为两者都不相同tableB.fieldB a b a 和< strong> c )
  • tableA.keyA = 4不正常,因为两者都不相同tableB.fieldB a b a ,< strong> b 和 c

我需要一个可以给我这个结果的查询。我希望有人能帮助我,或者能指出我正确的方向。

2 个答案:

答案 0 :(得分:1)

假设没有重复项,您可以使用自联接和聚合执行此操作:

select c.keyA, c2.keyA
from (select c.*, count(*) over (partition by keyA) as numBs
      from clientTable c
     ) c join
     (select c.*, count(*) over (partition by keyA) as numBs
      from clientTable c
     ) c2
     on c2.fieldB = c.fieldB and
        c2.keyA <> c.keyA and
        c.keyA = 1  -- or whatever key you want to check
where c.numBs = c2.numBs
group by c.keyA, c2.keyA, c.numBs, c2.numBs
having count(*) = c.numBs; 

我们的想法是计算每个fieldB的{​​{1}}值的数量。这些必须相等(keyA)并检查所有匹配(where c.numBs = c2.numBs)。

答案 1 :(得分:1)

尝试这个简单的查询,希望这可以解决您的问题

DECLARE @vkey int = 1
;WITH cte_test AS ( 
SELECT keyA,(SELECT ','+fieldb FROM tableB t1 WHERE t1.keyA = t.keyA FOR XML path('')) AS rslt
from   tableB t
GROUP BY t.keyA)
SELECT  t2.*
FROM    cte_test t1
    INNER JOIN cte_test t2 ON t1.[rslt] = t2.[rslt] AND t2.[keyA] <> t1.[keyA]
WHERE   t1.[keyA] = @vkey

如果没有其他项目具有相同的组合,则结果中没有记录,否则将返回匹配的项目。