使用union all和rank with order优化sql配置单元查询

ix0qys7i  于 2021-05-29  发布在  Hadoop
关注(0)|答案(1)|浏览(510)

当前场景:我有一个查询,它对两组数据进行联合,然后根据排名选择字段,但根据我的分析,整个数据集可以从联合的一侧删除
分析:如果你看下面的查询,我认为,我们可以完全忽略并删除由p,q,r,s和t表的连接生成的数据集
我能在这里用union替换unionall吗
查询:

SELECT OUTERV.f1, ... OUTERV.f30
FROM 
      (
        SELECT 
          unionV.f1, ...unionV.f30, ROW_NUMBER() over (PARTITION BY unionV.ifc order by  unionV.orderNUM_ asc) rank_
        FROM 
          (
            SELECT f1 .. few fields, 1 as ORDERNUM_ 
            FROM 
            A 
            JOIN B on A.id = B.id 
            JOIN ( SELECT few remaining fields FROM C )  
            C ON C.id = B.id
            JOIN D ON C.id = D.id
            JOIN E ON E.id = D.id
            JOIN F on F.id = E.id
            UNION ALL 
            SELECT 
              f1, f2, ...f30 , 2 as ORDERNUM_ 
            FROM 
            P 
            JOIN Q ON P.id = Q.id
            JOIN R ON Q.id = R.id
            JOIN S on S.id = R.id
            JOIN T on S.id = T.id

          )unionV
      ) 
OUTERV where 
OUTERV.rank_ = 1

请求:请确认我的分析是否正确。

vngu2lb8

vngu2lb81#

我不同意这种分析;它所做的假设可能是不真实的。但是,如果可以保证联合体的第二部分中的所有ifc值都存在于联合体的第一部分,并且总是这样,那么您的分析是正确的。
基本上,您所做的查询是信任第一组联合的数据,而不是信任第二组联合的数据。但是,如果第二个集合中存在ifc值而不是第一个集合中的ifc值;它必须来自联盟的第二部分;因此,删除联合体的第二部分可以删除记录。
例子:
假设unionv.ifc来自表 A 以及 P 在联盟的每一边
假设以下数据 A & P .

A.ifc
A
B

P.ifc
A
Z

在您当前的查询中,结果将是

A (from A table)
B (from A table)
Z (from P Table)

如果你消除了联合的第二部分,你就消除了p,因此z将被排除在结果之外;因此,它们是不相等的,你不能删除工会的第二部分。
现在,如果第二个集合中定义的所有ifc都包含在由并集定义的第一个集合中,那么这总是正确的;是的,你可以消除工会的第二部分。因为第一套首先包含了完整的一套。但是,如果这不是一个保证为真的语句,那么当前使用a…f和p…t上的并集的方法将生成“主集”

相关问题