在不使用 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
用于AGGREGATION
,DISTINCT
用于获取其含义。 DISTINCT + ANALYTIC => 无意义且错误的查询。
在您的情况下,如前所述,您需要做的就是使用UNION
而不是UNION ALL
。 UNION ALL 包括重复项,而 UNION 将删除它们。所以无需显式使用DISTINCT
,让Oracle 为您完成这项工作。
【讨论】:
UNION 在内部对所有获取的记录执行隐式 DISTINCT,不是吗? 它从每个查询返回的行的结果集中挑选不同的行。以上是关于在不使用 distinct 的情况下从查询中获取唯一记录集的主要内容,如果未能解决你的问题,请参考以下文章
如何在不使用 regexp_like 的情况下从列中获取整数
如何在不使用 CURDATE、MONTH、YEAR 等 DATE 函数的情况下从 RDBMS 获取当前月份记录
一对多关系在不使用“distinct”的情况下获取重复的对象。为啥?