2014-04-15 55 views
-1

以下是我在表中記錄的示例。 EntriesPerSet列包含該表中SET_ID的記錄數。我需要建立屬於不同SET_ID的行之間的等價關係。當且僅當它們包含相同數量的每個集合的條目並且每個條目在另一集合中具有對應條目時(通過檢查K1的& K2的值),集合纔是等價的。在以下情況下,SET_IDs 1和2是等效的。識別SQL Server中的等效集

SET_ID K1 K2 EntriesPerSet 
1 a b 4 
1 c d 4 
1 e f 4 
1 g h 4 
2 a b 4 
2 c d 4 
2 e f 4 
2 g h 4 
3 a b 5 
3 c d 5 
3 e f 5 
3 g h 5 
3 i j 5 
4 a b 3 
4 c d 3 
4 e f 3 
5 a b 4 
5 c d 4 
5 e f 4 
5 p q 4 

請幫助我如何做到這一點。謝謝!

+1

這種情況下的預期結果是什麼? –

+0

您是將每套設備與其他套件或特定套件進行比較? – Andrew

+0

在這種情況下的預期輸出是1 - 2(因爲只有1和2是等效的) – user3525048

回答

0

如果你只是想知道哪些對等價,你可以使用一個公共表達式來獲得所有可能的組合,並且找出它們中的哪些完全重疊;

WITH cte AS (
SELECT DISTINCT a.SET_ID aid, b.SET_ID bid, a.EntriesPerSet 
FROM mysets a 
JOIN mysets b ON a.EntriesPerSet = b.EntriesPerSet AND a.SET_ID < b.SET_ID 
) 
SELECT aid, bid FROM cte 
WHERE EntriesPerSet = (
SELECT COUNT(*) FROM (
    SELECT K1,K2 FROM mysets WHERE SET_ID=aid 
    INTERSECT 
    SELECT K1,K2 FROM mysets WHERE SET_ID=bid 
) a 
) 

An SQLfiddle to test with

+0

這種工作就像一個魅力!感謝Joachim! – user3525048

+0

只是基於這個程序的輸出一個簡單的問題。如果一個集合有多個等價的集合,比如說1等於2和3,那麼我得到以下輸出:1-2,1-3,2-3。有沒有辦法在公用表表達式本身中消除像2-3這樣的行?我的最終目標是確定可以放置這些集合的獨特桶(一個桶包含所有等效集合)。 – user3525048