我有一个像
这样的查询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
效率更高?
我还有其他方法吗?
答案 0 :(得分:1)
如果你有一个UNION(不是UNION ALL),会有一个隐含的DISTINCT,所以不需要做一个明确的DINSTINCT
答案 1 :(得分:1)
进一步解释,
ANALYTIC
用于AGGREGATION
,DISTINCT
用于获取其含义。 DISTINCT + ANALYTIC =>毫无意义和错误的查询。
根据您的建议,您需要做的就是使用UNION
代替UNION ALL
。 UNION ALL包含重复项,而UNION将删除它们。因此,无需明确使用DISTINCT
,让Oracle为您完成工作。