前段时间遇到个比较奇怪的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没有结果。