Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 选择某些键值相同的DB记录_Sql_Oracle - Fatal编程技术网

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

Sql 选择某些键值相同的DB记录,sql,oracle,Sql,Oracle,我有一个OracleDB表选项卡,其中有两个关键字段:f1和f2。现在我需要从该表中选择所有这些条目,其中f1至少有两个条目相同,因此只有f2不同 因此,在上面的示例中,SELECT应该返回f1=b或c的所有条目。我尝试了以下选择,但不起作用: SELECT f1, f2 FROM tab GROUP BY f1, f2 HAVING count( f1 ) > 1 如何实现这一点有什么想法吗?您可以在分析版本中使用count: select f1, f2 from (

我有一个OracleDB表选项卡,其中有两个关键字段:f1和f2。现在我需要从该表中选择所有这些条目,其中f1至少有两个条目相同,因此只有f2不同

因此,在上面的示例中,SELECT应该返回f1=b或c的所有条目。我尝试了以下选择,但不起作用:

SELECT f1, f2
  FROM tab
 GROUP BY f1, f2
HAVING count( f1 ) > 1
如何实现这一点有什么想法吗?

您可以在分析版本中使用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

这应该会起作用,并且让您看起来很熟悉:

SELECT f1, f2
FROM tab t1
WHERE f1 IN (SELECT f1 
             FROM tab t2 
             WHERE t1.f2 <> t2.f2)
基本上,我们检查f1是否在f2不匹配的地方再次找到

在以下情况下,始终可以使用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 );

但我个人可能会使用上面@Poundstibbons提出的分析版本。

谢谢,这似乎很好。即使我不知道你到底在这里干什么-内部查询包含所有字段加上F1外观数的信息。外部查询筛选结果并仅选择计数大于1的结果。关于分析函数、分区、排序的更多信息。难道一个人不能简单地使用吗?@davidaber是的,那就行了,我已经更新了答案
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 );