我有一个Oracle数据库表tab
,其中包含两个关键字段:f1
和f2
。现在我需要从该表中选择所有这些条目,其中f1
对于至少两个条目是相同的(因此只有f2
不同)。
f1 |f2
----+----
a |123
b |123
c |123
d |123
b |456
e |123
c |789
因此,在上面的示例中,SELECT应返回f1
= b
或c
的所有条目。我尝试使用以下SELECT,但这不起作用:
SELECT f1, f2
FROM tab
GROUP BY f1, f2
HAVING count( f1 ) > 1
任何想法如何实现这一目标?
答案 0 :(得分:2)
您可以在分析版本中使用count
:
select f1, f2
from (
select tab.*, count(1) over (partition by f1) cnt from tab
)
where cnt>1
结果:
F1 F2
----- ----------
b 123
b 456
c 123
c 789
答案 1 :(得分:0)
这应该有用,看起来很熟悉:
SELECT f1, f2
FROM tab t1
WHERE f1 IN (SELECT f1
FROM tab t2
WHERE t1.f2 <> t2.f2)
基本上,我们会检查f1
是否在f2
不匹配时再次找到{{1}}。
答案 2 :(得分:0)
在这样的情况下,可以始终使用EXISTS
:
SELECT t1.f1, t2.f2 FROM tab t1
WHERE EXISTS ( SELECT 1 FROM tab t2
WHERE t2.f1 = t1.f1
AND t2.f2 <> t2.f2 );
但我个人可能会使用上面提到的@PonderStibbons提供的分析版本。