我正在尝试检查我在'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的数量不固定 谢谢你的帮助!
答案 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组中没有重复键/值对。