Oracle 外连接 LEFT JOIN

前段时间遇到个比较奇怪的SQL,总结一下留个记录。

我们都知道,left join如果不满足的时候,就会以null的形式填充,但是这里有点不一样的写法。

SQL1:

WITH tgt AS (
    SELECT
        1 a
        , 2 b
        , 3 c
    FROM
        dual
)
, tgt2 AS (
    SELECT
        2 a
        , 2 b
        , 3 c
    FROM
        dual
)
SELECT
    t1.*
    , t2.*
FROM
    tgt t1
LEFT JOIN tgt2 t2 
ON
    t1.b = t2.b
WHERE
    1 = 1
    -- 本sql 有无下面条件的执行结果
    AND t1.a = t2.a

SQL2:

WITH tgt AS (
    SELECT
        1 a
        , 2 b
        , 3 c
    FROM
        dual
)
, tgt2 AS (
    SELECT
        2 a
        , 2 b
        , 3 c
    FROM
        dual
)
SELECT
    t1.*
    , t2.*
FROM
    tgt t1
LEFT JOIN tgt2 t2 
ON
    t1.b = t2.b
    AND t1.a = t2.a
WHERE
    1 = 1

比较两个sql的不同之处,可以发现,left join中的条件不同,SQL1中是写在where中,SQL2是写在我们常见的left join中,大家可以猜一下两个sql的执行结果。

SQL1执行结果: 

     

SQL2执行结果:

      

 产生以上两种不同结果的原因就是,SQL1中的【AND t1.a = t2.a】位置不同产生不一样的结果。

本来t1和t2是left join的形式进行关联,但是将条件写在了where中,此时这种情况,我们就可以将此时的left join当作普通的INNER JOIN来看,也就是直连。所以SQL1没有结果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值