选择某些键值相同的数据库记录

Posted

技术标签:

【中文标题】选择某些键值相同的数据库记录【英文标题】:Select DB records where some key values are the same 【发布时间】:2015-03-10 10:49:34 【问题描述】:

我有一个 Oracle DB 表 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

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

【问题讨论】:

【参考方案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

【讨论】:

不能简单地使用&lt;&gt;吗? @DavidFaber 是的,我已经更新了答案

以上是关于选择某些键值相同的数据库记录的主要内容,如果未能解决你的问题,请参考以下文章

数据表记录包含表索引和数值,请对表索引相同的记录进行合并,即将相同索引的数值进行求和运算,输出按照key值升序进行输出。

如果自定义分区器为具有相同键的记录选择不同的分区怎么办?

附加类型实体失败,因为相同类型的另一个实体已经具有相同的主键值。

华为机试:合并表记录

算法 合并表记录

EF报错 附加类型model失败