我需要查询帮助才能找到双打。让我们通过例子来解释这种情况:
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
的值为:
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 )我需要一个可以给我这个结果的查询。我希望有人能帮助我,或者能指出我正确的方向。
答案 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
如果没有其他项目具有相同的组合,则结果中没有记录,否则将返回匹配的项目。