从查询中获取一组唯一记录,而不使用distinct

时间:2014-09-30 07:54:35

标签: sql oracle

我有一个像

这样的查询
SELECT E1.name,E1.id from E1
union all
SELECT E2.name,E2.id from E2

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

我想从上面的查询中获得一组唯一的行。我知道我可以在查询之上使用“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效率更高? 我还有其他方法吗?

2 个答案:

答案 0 :(得分:1)

如果你有一个UNION(不是UNION ALL),会有一个隐含的DISTINCT,所以不需要做一个明确的DINSTINCT

答案 1 :(得分:1)

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

根据您的建议,您需要做的就是使用UNION代替UNION ALL。 UNION ALL包含重复项,而UNION将删除它们。因此,无需明确使用DISTINCT,让Oracle为您完成工作。