交叉连接在Sql Server中并不总是返回所有表中的所有行

时间:2014-10-13 11:39:10

标签: sql sql-server cross-join

如果其中一个表没有任何行

,则有时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 但它没有返回任何行

有没有解释?

1 个答案:

答案 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保留任何一方)