如果其中一个表没有任何行
,则有时Cross join不会返回任何行例如
WITH q1
AS ( SELECT 1 AS V1
WHERE 0 <> 0
),
q2
AS ( SELECT 2 AS V2
)
SELECT *
FROM q1 ,
q2
我希望这个查询将返回一行V1 = null和V2 = 2 但它没有返回任何行
有没有解释?
答案 0 :(得分:5)
交叉连接(笛卡儿积)返回两个表中的每个行组合。即一张桌子上的每一行与另一侧的每一行配对。
这会提供M * N
行,其中M
是一侧的行数,N
是另一侧的行数。
乘以零返回零。
如果要保留另一侧没有匹配的行,则需要外连接。
WITH q1
AS ( SELECT 1 AS V1
WHERE 0 <> 0
),
q2
AS ( SELECT 2 AS V2
)
SELECT *
FROM q1 RIGHT OUTER JOIN
q2 ON 1=1
(或FULL OUTER JOIN
保留任何一方)