假设我的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_B
和COL_C
不同的记录,而不管表格中的所有其他列(因此无法使用)我的SQL中的Distinct
子句,并忽略COL_A
的所有值的所有值都相同的任何记录(在此示例中,COL_B
& {的所有值当COL_C
=“C”)时,{1}}是相同的。
(换句话说 - 只返回匹配COL_A
的{{1}} / COL_B
值中至少有一个差异的值,而不管表的其他行。)
所以,我希望我的结果集是:
COL_C
所以,我写的SQL看起来如下:
COL_A
现在,这有效,但我想知道是否有更好/更有效的方法来获取这些数据?
感谢!!!
答案 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)
如果您想要排序的行,请在末尾添加order by
。
使用(COL_A)
上的索引,这会表现得非常好。使用(COL_A, COL_B, COL_C)
上的复合索引,这将表现得非常好。
答案 1 :(得分:1)
您可以使用exists
子查询要求至少有一行具有相同的col_a
,但存在不同的col_b
或col_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)
)