我有一个左联盟和一个联盟。 我在想是否可以用连接替换联合
select t1.col1,t1.col2,t2.col1,
from t1
left join t2 on (t1.col1 = t2.col1)
union
select t3.col1,t3.col2,t2.col1
t2.col1,
from t3
left join t2 on (t3.col1 = t2.col1)
我在Oracle 12c上可以在没有联合的情况下重写这个查询吗? 我尝试了这个,但结果与联合查询的结果不匹配
select t1.col1,t3.col2,t2.col1,
from t1
left join t2 on (t1.col1 = t2.col1)
left join t3 on (t3.col1 = t2.col1 and t1.col1 = t2.col1)
任何想法都有可能吗?
答案 0 :(得分:0)
以下是您的几种选择:
在加入t2之前,首先执行t1和t3的并集:
select t.col1, t.col2, t2.col1
from (select col1, col2
from t1
union
select col1, col2
from t3) t
left outer join t2 on (t.col1 = t2.col1);
在加入t2之前,先使用t1和t3的完整外连接:
select t.col1, t.col2, t2.col1
from (select coalesce(t1.col1, t3.col1) col1,
coalesce(t1.col2, t3.col2) col2
from t1
full outer join t3 on t1.col1 = t3.col1
and t1.col2 = t3.col2) t
left outer join t2 on (t.col1 = t2.col1);
N.B。两者都未经过测试,因为您忽略了在三个表中的任何一个中提供任何样本数据。你必须自己测试这些方法。
ETA:另外,我认为这两种方法对于这个例子应该。如果您的真实场景与您的问题中的场景不同,那么这两种方法都不可能有用。
ETA2:鉴于您希望调整查询的可读性,我会选择我的第一个提议的解决方案(假设它适合您,当然!),因为联合重复数据删除表t1和t3中的行< em>在加入t2之前 - 这样,你就减少了加入所需的工作。此外,工会也很少检查(2门而不是3门)。
它可能有一个联盟,但它确实比我的第二个建议更好看!至少,在我看来* {; - )