SQL - 比较组是唯一的

SQL - comparing groups to be unique

我正在尝试检查我在 'group by' 子句中创建的集合的唯一性。

假设我有一个名为 RelevantKeys 的 table:

KeyID | KeyValue | MainID  
1     | a        |  C1  
1     | a        |  C2  
1     | a        |  C3  
2     | b        |  C1  
2     | b        |  C2  
2     | a        |  C3  

KeyIDs 和它们的值形成了类似于复合键的东西来标识 MainId。我想检查是否存在重复项。

在上面的示例中,预期答案为真,因为 C1 和 C2 的所有 KeyId 都具有相同的 KeyValues:
C1,C2: (a,b)
C4: (a,a)

但是,我希望对以下内容给出否定答案 - 例如如果它们不共享值的全部组成,则在第一个索引中共享相同的值不算重复。

KeyID | KeyValue | MainID  
1     | a        |  C1  
1     | a        |  C3  
2     | b        |  C1  
2     | a        |  C3  

分组似乎合乎逻辑,但我不知道如何检查所有组中所有行的唯一性。聚合函数不起作用,因为我需要比较整个组,而不仅仅是每个组中的行。

SELECT R.MainID
FROM RelevantKeys R
GROUP BY R.MainID

我怎样才能做到这一点?注意KeyID的个数不固定
感谢您的帮助!

Select keyId, keyvalue, count(distinct mainID)
from RelevantKeys
group by keyId, keyvalue
Having count(distinct mainId) > 1

您可以使用 EXCEPT 检查一组中存在的记录,而不是另一组中的记录。通过使用两次这样的检查,您可以确保一组中的所有记录都与另一组中的所有记录相匹配。以下列出了所有键及其匹配项:

with mainKeys (MainId) as
(
  select distinct MainId
  from RelevantKeys
)
select k1.MainId as MainId1, k2.MainId as MainId2
from MainKeys k1
cross join MainKeys k2
where k1.MainId != k2.MainId
and not exists
(
  select KeyId, KeyValue
  from RelevantKeys r
  where r.MainId = k1.MainId

  except

  select KeyId, KeyValue
  from RelevantKeys r
  where r.MainId = k2.MainId
)
and not exists
(
  select KeyId, KeyValue
  from RelevantKeys r
  where r.MainId = k2.MainId

  except

  select KeyId, KeyValue
  from RelevantKeys r
  where r.MainId = k1.MainId
)

请注意,对于每个匹配项,都会返回两行,每个 MainId。此外,这假设顺序无关紧要,并且没有 key/value 对在 MainId 组中重复。

Sql Fiddle