当前场景:我有这个查询,它在两组数据上进行联合,然后根据等级选择字段但是根据我的分析,整个数据集可以在UNION的一侧删除
分析:所以如果你看下面的查询 - 我认为,我们可以完全忽略并删除由表连接生成的数据集: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
要求:请确认我的分析是否正确。
我不同意分析;它做出的假设可能不正确。但是,如果您可以保证联合的第二部分中的所有IFC值都存在于并集的第一部分中,并且总是这样,那么您的分析是正确的。
基本上你所做的查询是信任来自第一组联合的数据而不是第二组联合。但是,如果第二组中的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都包含在由联合定义的第一个集合中,那么它总是为真;那么是的,你可以消除联盟的第二部分。因为第一组首先包含完整的集合。但是,如果这不是一个保证的真实陈述,那么当前使用联合的方法... ... F和P ... T生成“主集”