SQL-比较组是否唯一

SQL-比较组是否唯一,sql,sql-server,unique,Sql,Sql Server,Unique,我试图检查我在“GROUPBY”子句中创建的集合的唯一性 假设我有一张名为RelevantKeys的表: KeyID | KeyValue | MainID 1 | a | C1 1 | a | C2 1 | a | C3 2 | b | C1 2 | b | C2 2 | a | C3 keyid及其值形成类似于复合键的形

我试图检查我在“GROUPBY”子句中创建的集合的唯一性

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

KeyID | KeyValue | MainID  
1     | a        |  C1  
1     | a        |  C2  
1     | a        |  C3  
2     | b        |  C1  
2     | b        |  C2  
2     | a        |  C3  
keyid及其值形成类似于复合键的形式来标识MainId。我想检查一下,是否有重复的

在上面的示例中,预期答案为true,因为对于C1和C2,所有KeyID的KeyValue都相同:
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的数量不是固定的。

谢谢你的帮助

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

Select keyId, keyvalue, count(distinct mainID)
from RelevantKeys
group by keyId, keyvalue
Having count(distinct mainId) > 1
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组中没有重复的键/值对


在第二个示例中,为什么两行中的1&a不会导致“真”答案?但是在第二个示例中,C1和C3在keyId和keyValue中不是共享相同的值吗?(即,{1,a})?它们需要共享KeyValue的整个组成,将其想象为一个由KeyID索引的向量,其中包含来自列KeyValue的值。在第二种情况下,C1的矢量是(a,b),C3的矢量是(a,a),例如不相同。不清楚。。。你说的“索引向量”是什么意思?定义你的术语。向量中有什么值,?您通过“索引”它来对该向量执行什么操作?恐怕这在这种情况下不起作用-我需要比较与每个MainID关联的键值的整个组合,而不是KeyID和KeyValues的组合解释您所说的“键值的整个组合”是什么意思。恐怕这还不完全清楚。很抱歉搞混了。我有一组keyid,每个keyid都有它的值。键和值的组合不必是唯一的,但是不能有两个具有相同值的键的主干。考虑一下,假设MaNID标识两个客户机C1和C2。它们有两个keyid,例如DatabaseName和ServerName。它们可以在不同的服务器上有相同的数据库,它们可以在相同的服务器上,但不在相同的数据库上。太棒了,但有必要同时使用这两种方法吗?@n1nde如果只使用一种方法,当一个MainId的键/值组具有所有相同的键/值以及一些附加值时,它将匹配。因此,如果C1有(a,b,c)和C2有(a,b),它将返回一行,显示C2匹配C1,但没有一行显示C1匹配C2。就记录而言,在我的情况下,我还可以假设两个组具有相同的长度,例如,我只能检查一次集差。谢谢