选择某些键值相同的数据库记录
Posted
技术标签:
【中文标题】选择某些键值相同的数据库记录【英文标题】:Select DB records where some key values are the same 【发布时间】:2015-03-10 10:49:34 【问题描述】:我有一个 Oracle DB 表 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
任何想法如何实现这一目标?
【问题讨论】:
【参考方案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
【讨论】:
谢谢,这似乎工作正常。即使我不知道你到底在做什么;-) 内部查询包含所有字段加上 F1 出现次数的信息。外部查询过滤结果并仅选择 count>1 的结果。更多关于分析函数、分区、排序here.【参考方案2】:在以下情况下始终可以使用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 提出的分析版本。
【讨论】:
【参考方案3】:这应该可以工作并且您看起来很熟悉:
SELECT f1, f2
FROM tab t1
WHERE f1 IN (SELECT f1
FROM tab t2
WHERE t1.f2 <> t2.f2)
基本上,我们检查是否在f2
不匹配的地方再次找到f1
。
【讨论】:
不能简单地使用<>
吗?
@DavidFaber 是的,我已经更新了答案以上是关于选择某些键值相同的数据库记录的主要内容,如果未能解决你的问题,请参考以下文章
数据表记录包含表索引和数值,请对表索引相同的记录进行合并,即将相同索引的数值进行求和运算,输出按照key值升序进行输出。