一尘不染

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

sql

我正在使用一个表,该表是一组其他表的一部分。根据键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,D2,D3) AS
(
    SELECT D1, D2, D3
    FROM SOURCE
    GROUP BY D1, D2, 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.D2, S.D3, S.C4, S.C5, S.C6

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


阅读 161

收藏
2021-03-17

共1个答案

一尘不染

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

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
2021-03-17