2015-04-23 24 views
0

我在具有列FirstID和SecondID的(SQL Server 2014)数据库中有一个联结表。给定一个特定的FirstID,我希望从表中找到所有其他具有等效SecondIDs集合的FirstID(即使该集合是空的)。 示例数据:在数据库表中查找匹配集合

FirstId  SecondId 
1   1 
1   2 
2   3 
3   1 
3   2 
...   ... 

在样本数据的情况下,如果我指定FirstID = 1,则我期望3出现在结果集。

我试过以下,到目前为止,这工作得很好,除了空集:

SELECT FirstSecondEqualSet.FirstId 
FROM FirstSecond FirstSecondOriginal 
INNER JOIN FirstSecond FirstSecondEqualSet ON FirstSecondOriginal.SecondId = FirstSecondEqualSet.SecondId 
WHERE FirstSecondOriginal.FirstId = @FirstId  
    AND FirstSecondEqualSet.FirstId != @FirstId 
GROUP BY FirstSecondEqualSet.FirstId 
HAVING COUNT(1) = (SELECT COUNT(1) FROM FirstSecond WHERE FirstSecond.FirstId = @FirstId) 

回答

1

我认为这是某种联系关系司没有余(RDNR)。请参阅Dwain Camps的伟大article以供参考。

DECLARE @firstId INT = 1 

SELECT 
    f2.FirstId 
FROM FirstSecond f1 
INNER JOIN FirstSecond f2 
    ON f2.SecondId = f1.SecondId 
    AND f1.FirstId <> f2.FirstId 
WHERE 
    f1.FirstId = @firstId 
GROUP BY f2.FirstId 
HAVING COUNT(*) = (SELECT COUNT(*) FROM FirstSecond WHERE FirstId = @firstId) 
+0

谢谢,但是这基本上是我在我的问题写了同样的事情(唯一的区别是,你从WHERE子句联接表达式,它是由相同的解释移动f1.FirstId <> f2.FirstId大多数RDBMS引擎)。 – Patrick

+0

噢,对不起。你能否详细说明* empty set *问题? –

+0

编辑:没关系,我只是意识到空集的东西是没有意义的,没有领域的情况下,并不是真的那个正确的场地。 – Patrick

1

这是一种方法。它计算每个firstid的值的数量,然后加入secondid

select fs2.firstid 
from (select fs1.*, count(*) over (partition by firstid) as numseconds 
     from firstsecond fs1 
     where fs1.firstid = @firstid 
    ) fs1 join 
    (select fs2.*, count(*) over (partition by firstid) as numseconds 
     from firstsecond fs2 
    ) fs2 
    on fs1.secondid = fs2.secondid and fs1.numseconds = fs2.numseconds 
group by fs2.firstid 
having count(*) = max(fs1.numseconds);