带有OR条件的FULL OUTER JOIN

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了带有OR条件的FULL OUTER JOIN相关的知识,希望对你有一定的参考价值。

我有2个表,有2个不同的id。我想基于2个不同的id和一些其他参数加入,但问题是1 id并不总是匹配。有时身份证号码1会有匹配,有时身份证号码2将不匹配,有时候两者都匹配。

full outer join子句中使用ORJOIN条件确实减慢了我的查询速度。有更有效的方法吗? 我知道你可以在内连接的情况下使用联合,但我不确定如何使用外连接进行优化。

SELEC A.*, B.*
FROM A
FULL OUTER JOIN  B
    ON  (A.id_1 = B.id_1 or A.id_2 = B.id_2)
    AND A.pay_month = B.pay_month
    AND A.plan = B.plan
答案

嗯。 。 。这可能就足够了:

select A.*, B.*
from A full outer join 
     B
     on A.id_1 = B.id_1 and A.pay_month = B.pay_month and A.plan = B.plan
union  -- intentionally to remove duplicates
select A.*, B.*
from A full outer join 
     B
     on A.id_2 = B.id_2 and A.id_1 <> B.id_1 and A.pay_month = B.pay_month and A.plan = B.plan;

这不是100%等效 - 例如,即使在表中也会删除重复项。此外,union增加了删除重复项的开销。但结果可能对您的目的有利。

还有,full outer join真的有必要吗?我很少在我的代码中使用它。

以上是关于带有OR条件的FULL OUTER JOIN的主要内容,如果未能解决你的问题,请参考以下文章

pgSQL FULL OUTER JOIN 'WHERE' 条件

Oracle表与表之间的连接方式(内连接:inner join 外连接 全连接: full outer join左连接:left outer join 右连接:right outer join(代码

FULL OUTER JOIN 不能在没有连接两边的字段相等的条件下使用

oracle的full outer join如何排除掉空值

如果没有条件与连接两侧的字段相等,则不能使用FULL OUTER JOIN

Redshift:将 FULL OUTER 替换为 CROSS JOIN