假设我有下表:
ID | CMP1 | CMP2 | CMP3 | FK1
------------------------------
1 | x | x | x | 1
2 | y | y | y | 1
3 | z | z | z | 1
------------------------------
4 | a | a | a | 2
5 | a | a | a | 2
6 | c | c | c | 2
------------------------------
7 | s | u | v | 3
8 | s | u | i | 3
9 | s | u | z | 3
现在,我必须编写一个查询,该查询返回FK1引用但在CMP1-3中具有不同值的所有ID。
示例:
我知道我必须自行加入表,但是我无法比较按FK1分组的值-请帮助!
谢谢
答案 0 :(得分:0)
您似乎想要(cmp1,cmp2,cmp3,fk1)值唯一的行。您可以使用窗口功能:
select t.*
from (select t.*,
count(*) over (partition by cmp1, cmp2, cmp3, fk1) as cnt
from t
) t
where cnt = 1;
另一种方法使用not exists
:
select t.*
from t
where not exists (select 1
from t t2
where t2.fk1 = t.fk1 and
t2.cmp1 = t.cmp1 and
t2.cmp2 = t.cmp2 and
t2.cmp3 = t.cmp3 and
t2.id <> t.id
);
也就是说,没有其他行具有相同的(fk1, cmp1, cmp2, cmp3)
组合-和不同的id
。