替换涉及左连接的联合查询

时间:2016-12-15 14:19:39

标签: oracle

我有一个左联盟和一个联盟。 我在想是否可以用连接替换联合

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)

任何想法都有可能吗?

1 个答案:

答案 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门)。

它可能有一个联盟,但它确实比我的第二个建议更好看!至少,在我看来* {; - )