Sql-Server

SQL:找到匹配多行的唯一多列值三元組?

  • August 13, 2022

TL;DR:使用 Transact-SQL/SQL Server,我如何才能找到與另一列中的某些值集的單個“解決方案”三元組列值(ColA、ColB、ColC)匹配的表行?

更多資訊:假設我有一個與此類似的表(刪除了 ID 列以獲得焦點):

我試圖找到每個 FID 值存在的 (ColA, ColB, ColC) 值的共同三元組。在此範例中, (1, 1, 1) 將是那個三元組,所以我想返回如下內容:

感覺它應該是某種設置操作,intersect但我很難以最好的方式對它進行聲明性建模和編碼。想法?非常感謝您的幫助!

澄清:希望能幫助解釋我的問題的幾點。

  1. 我正在尋找一個查詢來查找三元組可能是什麼。我不一定知道它在數據中是什麼。
  2. 三元組值不依賴於 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;

兩者都給出:

db<>小提琴

引用自:https://dba.stackexchange.com/questions/315564