SQL - 比较组是唯一的

时间:2015-07-16 13:16:15

标签: sql sql-server unique

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

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

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

KeyID及其值形成类似于标识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的数量不固定 谢谢你的帮助!

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

您可以使用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一行。此外,这假设排序并不重要,并且MainId组中没有重复键/值对。

Sql Fiddle