微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何查找键重复但在所有列中都不重复的行?

如何解决如何查找键重复但在所有列中都不重复的行?

有什么理由不只是创建另一个表表达式来覆盖更多字段并加入该表表达式中?

WITH DUPLICATEKEY(D1,D2,D3) AS
(
    SELECT D1, D2, D3
    FROM SOURCE
    GROUP BY D1, D2, D3
    HAVING COUNT(*)>1
)
WITH NODUPES(D1,D2,D3,C4,C5,C6) AS
(
SELECT 
S.D1, S.D2, S.D3, S.C4, S.C5, S.C6
FROM SOURCE S
GROUP BY
 S.D1, S.D2, S.D3, S.C4, S.C5, S.C6
HAVING COUNT(*)=1
)

SELECT S.D1, S.D2, S.D3, S.C4, S.C5, S.C6
FROM SOURCE S
INNER JOIN DUPLICATEKEY D
    ON S.D1 = D.D1 AND S.D2 = D.D2 AND S.D3 = D.D3

INNER JOIN NODUPES D2
    ON S.D1 = D2.D1 AND S.D2 = D2.D2 AND S.D3 = D2.D3

ORDER BY S.D1, S.D2, S.D3, S.C4, S.C5, S.C6

解决方法

我正在使用一个表,该表是一组其他表的一部分。根据键D1,D2和D3,提取表的所有行都应该是唯一的。他们不是。看来,较早的开发人员试图通过使用SELECT DISTINCT从此表查询的所有列来解决此问题。这将起作用,但是仅当在(D1,D2,D3)上重复的每一行也是跨非键列的重复(忽略添加到提取表中的IDENTITY列)时。

换句话说,给定的行如下:

D1  D2  D3  C4  C5  C6
=== === === === === ===
A   B   C   X1  X2  X3
A   B   C   X1  X2  X3

然后

SELECT DISTINCT D1,D2,D3,C4,C5,C6
FROM BAD_TABLE

将“起作用”,因为在(D1,D2,D3)上重复的行之间没有区别。但是如果表包含

D1  D2  D3  C4  C5  C6
=== === === === === ===
A   B   C   X1  X2  X3
A   B   C   X1  X2  X4

然后SELECT DISTINCT将返回键(A,B,C)的两行。此外,我们必须确定X3或X4中的哪个是“正确”值。

我知道如何在(D1,D2,D3)上找到重复项。我什至知道如何找到所有列(IDENTITY列除外)中的重复项:

;
WITH DUPLICATES(D1,D3) AS
(
    SELECT D1,D3
    FROM SOURCE
    GROUP BY D1,D3
    HAVING COUNT(*)>1
)
SELECT S.D1,S.D2,S.D3,S.C4,S.C5,S.C6
FROM SOURCE S
INNER JOIN DUPLICATES D
    ON S.D1 = D.D1 AND S.D2 = D.D2 AND S.D3 = D.D3
ORDER BY S.D1,S.C6

问题是,如何找到上述结果集的子集,这些子集在(D1,D2,D3)上重复,但在(D1,D2,D3,C4,C5,C6)上 重复?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。