我们说我有一张带有列的表:A,B,C& d
如果出现以下情况,任何两行都被视为重复:
A,B,C具有相等的值但不是D
或
A,B,D具有相等的值但不是C.
如何获得一组重复的行?使用CTE是可以的。
答案 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
相同,则两个记录将获得相同的排名并赢得“选择。