Sql 选择某些键值相同的DB记录
我有一个OracleDB表选项卡,其中有两个关键字段:f1和f2。现在我需要从该表中选择所有这些条目,其中f1至少有两个条目相同,因此只有f2不同 因此,在上面的示例中,SELECT应该返回f1=b或c的所有条目。我尝试了以下选择,但不起作用: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 (
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 );