2015-04-23 64 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);