选择某些键值相同的DB记录

时间:2015-03-10 10:49:34

标签: sql oracle

我有一个Oracle数据库表tab,其中包含两个关键字段:f1f2。现在我需要从该表中选择所有这些条目,其中f1对于至少两个条目是相同的(因此只有f2不同)。

f1  |f2
----+----
a   |123
b   |123
c   |123
d   |123
b   |456
e   |123
c   |789

因此,在上面的示例中,SELECT应返回f1 = bc的所有条目。我尝试使用以下SELECT,但这不起作用:

SELECT f1, f2
  FROM tab
 GROUP BY f1, f2
HAVING count( f1 ) > 1

任何想法如何实现这一目标?

3 个答案:

答案 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提供的分析版本。