返回在某些列中至少存在1个差异的不同行

时间:2013-08-26 14:31:26

标签: sql oracle

假设我的Oracle DB中有一个表格,如下所示:

COL_A     COL_B     COL_C     COL_D   .... COL_XXX
A         1         2         1    ....
A         1         2         2    ....
A         1         2         3    ....
A         2         3         4    ....
B         1         2         5    ....
B         1         2         6    ....
B         1         2         7    ....
B         4         2         8    ....
B         1         4         9    ....
C         1         2         10    ....
C         1         2         11    ....
C         1         2         12    ....
C         1         2         13    ....
C         1         2         14    ....

我想只查找COL_A相同且COL_BCOL_C不同的记录,而不管表格中的所有其他列(因此无法使用)我的SQL中的Distinct子句,并忽略COL_A的所有值的所有值都相同的任何记录(在此示例中,COL_B& {的所有值当COL_C =“C”)时,{1}}是相同的。

(换句话说 - 只返回匹配COL_A的{​​{1}} / COL_B值中至少有一个差异的值,而不管表的其他行。)

所以,我希望我的结果集是:

COL_C

所以,我写的SQL看起来如下:

COL_A

现在,这有效,但我想知道是否有更好/更有效的方法来获取这些数据?

感谢!!!

2 个答案:

答案 0 :(得分:3)

将表连接到自身以查找与COL_A匹配但具有不同COL_B或COL_C的其他行:

select distinct t1.COL_A, t1.COL_B, t1.COL_C
from MyTable t1
join MyTable t2 on t1.COL_A = t2.COL_A
    AND (t1.COL_B != t2.COL_B OR t1.COL_C != t2.COL_C)

See this working on SQLFiddle

如果您想要排序的行,请在末尾添加order by

使用(COL_A)上的索引,这会表现得非常好。使用(COL_A, COL_B, COL_C)上的复合索引,这将表现得非常好。

答案 1 :(得分:1)

您可以使用exists子查询要求至少有一行具有相同的col_a,但存在不同的col_bcol_c

select  distinct col_a, col_b, col_c
from    YourTable yt1
where   exists
        (
        select  *
        from    YourTable yt2
        where   yt1.col_a = yt2.col_a
                and (yt1.col_b <> yt2.col_b
                     or yt1.col_c <> yt2.col_c)
        )

See it working at SQL Fiddle.