在SQL Server中标识等效集

时间:2014-04-15 19:37:49

标签: sql sql-server

以下是我在表格中记录的示例。 EntriesPerSet列包含表SET_ID中的记录数。我需要在属于不同SET_ID的行之间建立等价。当且仅当它们每个Set包含相同数量的条目时,集合将是等效的,并且每个条目在另一个集合中具有相应的条目(通过检查K1& K2中的值)。在以下情况中,SET_IDs 1和2是等效的。

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 :(得分:0)

如果您只是想知道哪些对是等价的,您可以使用公用表表达式来获得所有可能的组合,并使用INTERSECT来确定哪些对完全重叠;

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