如果两个特定列中的一个相等,则如何找到重复的行...以及第三个和第四栏是平等的?

时间:2016-06-14 14:05:45

标签: sql sql-server duplicates common-table-expression

我们说我有一张带有列的表:A,B,C& d

如果出现以下情况,任何两行都被视为重复:

A,B,C具有相等的值但不是D

A,B,D具有相等的值但不是C.

如何获得一组重复的行?使用CTE是可以的。

3 个答案:

答案 0 :(得分:0)

我认为您可以使用union all并使用相应的where条件来执行此操作。

select * from tablename where a=b and b=c and a<>d
union all
select * from tablename where a=b and b=d and a<>c

答案 1 :(得分:0)

使用自我加入非常简单:

SELECT DISTINCT t1.*
FROM TableName t1
INNER JOIN TableName t2 
    ON  T1.A = T2.A 
    AND T1.B = T2.B 
    AND (T1.C = T2.C OR T1.D = T2.D)

当然,假设如果所有4列都相同,那么它也是一个重复的行...

但是,如果由于某些奇怪的原因,这些行不被视为重复,您可以将ON子句中的条件更改为:

SELECT DISTINCT t1.*
FROM TableName t1
INNER JOIN TableName t2 
    ON  T1.A = T2.A 
    AND T1.B = T2.B 
    AND (
        (T1.C = T2.C AND T1.D <> T2.D)
        OR (T1.C <> T2.C AND T1.D = T2.D)
    )

答案 2 :(得分:0)

您可以使用RANK()检测重复项,而无需从表中选择两次:

SELECT s.* FROM (
    SELECT t.*,
           RANK() OVER(PARTITION BY t.a,t.b,t.c ORDER BY t.d) as d_dif,
           RANK() OVER(PARTITION BY t.a,t.b,t.D ORDER BY t.c) as c_dif
    FROM YourTable) s
WHERE s.d_dif > 1 or s.c_dif > 1

RANK()而不是ROW_NUMBER()处理重复项,因此如果d / c相同,则两个记录将获得相同的排名并赢得“选择。