在不使用 distinct 的情况下从查询中获取唯一记录集

Posted

技术标签:

【中文标题】在不使用 distinct 的情况下从查询中获取唯一记录集【英文标题】:Get set of Unique records from a query without using distinct 【发布时间】:2014-09-30 07:54:35 【问题描述】:

我有一个类似的查询

SELECT E1.name,E1.id from E1
union all
SELECT E2.name,E2.id from E2

对于给定的 name 和 id 的唯一组合,E1 和 E2 都有多个记录(假设同一个人有两个不同的电话号码,因此 E1.phone 对于具有相同 E1.name 和 E1.id 的两行是不同的)。因此,我的查询输出中有许多重复记录

我想要来自上述查询的一组唯一行。我知道我可以在查询顶部使用“DISTINCT”子句,例如:

SELECT distinct name,id 
from 
(SELECT E1.name,E1.id from E1
union all
SELECT E2.name,E2.id from E2);

但据我所知,Distinct 有性能开销。 有没有其他方法可以更有效地实现一组唯一记录? 现在,我想不出任何,除了使用

row_number() over partition by (name, id order by name)

但是使用row_number() 是否比DISTINCT 更有效? 还有其他我想念的方式吗?

【问题讨论】:

【参考方案1】:

如果你有一个UNION(不是UNION ALL),就会有一个隐含的DISTINCT,所以不需要显式的DINSTINCT

【讨论】:

对不起,查询有 union all 不是 union。更新了我的问题。 好的,所以使用 UNION 而不是 UNION ALL。我不相信有更有效的方法。可以尝试 GROUP BY 所有列,效果一样,但我怀疑它是否比 DISTINCT 更有效。【参考方案2】:

为了进一步解释, ANALYTIC 用于AGGREGATIONDISTINCT 用于获取其含义。 DISTINCT + ANALYTIC => 无意义且错误的查询。

在您的情况下,如前所述,您需要做的就是使用UNION 而不是UNION ALL。 UNION ALL 包括重复项,而 UNION 将删除它们。所以无需显式使用DISTINCT,让Oracle 为您完成这项工作。

【讨论】:

UNION 在内部对所有获取的记录执行隐式 DISTINCT,不是吗? 它从每个查询返回的行的结果集中挑选不同的行。

以上是关于在不使用 distinct 的情况下从查询中获取唯一记录集的主要内容,如果未能解决你的问题,请参考以下文章

如何在不创建查询的情况下从 Access 表中获取值

如何在不使用 regexp_like 的情况下从列中获取整数

如何在不使用 CURDATE、MONTH、YEAR 等 DATE 函数的情况下从 RDBMS 获取当前月份记录

一对多关系在不使用“distinct”的情况下获取重复的对象。为啥?

在不使用地图 android 的情况下从邮政编码中获取纬度和经度

如何在不使用return的情况下从函数中获取变量的地址(指针)