Finden Sie passende Sätze in einer databasetabelle

Ich habe eine Verbindungstabelle in einer (SQL server 2014) database mit Spalten FirstID und SecondID. Angesichts einer spezifischen FirstID, würde ich gerne alle anderen FirstIDs aus der Tabelle finden, die einen gleichwertigen Satz von SecondIDs haben (auch wenn dieser Satz leer ist). Beispieldaten:

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

Im Falle der Beispieldaten, wenn ich FirstID = 1 spezifiziert habe, würde ich erwarten, dass 3 in der Ergebnismenge erscheint.

Ich habe das bis jetzt ausprobiert, was ziemlich gut funktioniert, außer bei leeren Sätzen:

 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) 

Ich denke, es ist irgendwie im Zusammenhang mit der Relational Division ohne Remainder (RDNR) . Sehen Sie diesen großartigen Artikel von Dwain Camps als reference.

 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) 

Hier ist ein Ansatz. Es zählt die Anzahl der Werte für jeden firstid und dann verbindet sich auf der 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);