Sql-Server
SQL:找到匹配多行的唯一多列值三元組?
TL;DR:使用 Transact-SQL/SQL Server,我如何才能找到與另一列中的某些值集的單個“解決方案”三元組列值(ColA、ColB、ColC)匹配的表行?
更多資訊:假設我有一個與此類似的表(刪除了 ID 列以獲得焦點):
我試圖找到每個 FID 值存在的 (ColA, ColB, ColC) 值的共同三元組。在此範例中, (1, 1, 1) 將是那個三元組,所以我想返回如下內容:
感覺它應該是某種設置操作,
intersect
但我很難以最好的方式對它進行聲明性建模和編碼。想法?非常感謝您的幫助!澄清:希望能幫助解釋我的問題的幾點。
- 我正在尋找一個查詢來查找三元組可能是什麼。我不一定知道它在數據中是什麼。
- 三元組值不依賴於 FID 值,反之亦然。我的範例恰好使用了與 FID 值之一匹配的 (1,1,1)。數據可能看起來更像:
所以在這種情況下,我正在尋找如何編寫查詢,以發現 (1,415,928) 是所有 FID 共有的三元組。
希望這有助於更好地解決我的問題和我在尋找什麼:) 如果您需要更多資訊,請告訴我。
找到公共元組的一種方法:
DECLARE @T table ( FID integer NOT NULL, ColA integer NOT NULL, ColB integer NOT NULL, ColC integer NOT NULL ); INSERT @T (FID, ColA, ColB, ColC) VALUES (13,1,305,507), (13,1,415,928), (17,2,5,57), (17,1,415,928), (210,12,305,507), (210,1,415,928); SELECT T.ColA, T.ColB, T.ColC FROM @T AS T GROUP BY T.ColA, T.ColB, T.ColC HAVING COUNT_BIG(*) = ( SELECT COUNT_BIG(DISTINCT T2.FID) FROM @T AS T2 );
返回所有匹配的元組:
SELECT T.FID, T.ColA, T.ColB, T.ColC FROM @T AS T WHERE EXISTS ( SELECT T.ColA, T.ColB, T.ColC INTERSECT SELECT T2.ColA, T2.ColB, T2.ColC FROM @T AS T2 WHERE T2.FID <> T.FID ) AND NOT EXISTS ( SELECT T.ColA, T.ColB, T.ColC EXCEPT SELECT T3.ColA, T3.ColB, T3.ColC FROM @T AS T3 WHERE T3.FID <> T.FID );
或者
SELECT T1.FID, T2.ColA, T2.ColB, T2.ColC FROM ( SELECT T2.FID, rc = COUNT_BIG(*) OVER () FROM @T AS T2 GROUP BY T2.FID ) AS T1 JOIN ( SELECT T.ColA, T.ColB, T.ColC, rc = COUNT_BIG(DISTINCT T.FID) FROM @T AS T GROUP BY T.ColA, T.ColB, T.ColC ) AS T2 ON T2.rc = T1.rc;
兩者都給出: