所以我想做一个左连接,让左表中的每一行都在右表中包含一行空值,即使存在匹配也是如此。
这种类型的连接有名称吗?
有没有比我下面的方法更好的方法(即避免联合)?
SELECT
T1.C1,
...
T1.CN
T2.C1,
...
T2.CM
FROM
Table1 T1
INNER JOIN Table2 T2
ON T1.Key1 = T2.Key1
UNION
SELECT
T1.C1,
...
T1.CN,
NULL, --NULL 1
...
NULL, --NULL M
FROM
Table1 T1
Run Code Online (Sandbox Code Playgroud)
(我也可以从左连接开始,然后联合一个选择,就像上面的第二个选择一样,过滤到仅具有匹配 ID 的表,但这仍然是复杂的方法)。
我想知道是否有类似的东西
SELECT
T1.C1,
...
T1.CN
T2.C1,
...
T2.CM
FROM
Table1 T1
INNER JOIN Table2 T2 INCLUDE_NULL_ROW_WITH_MATCH
ON T1.Key1 = T2.Key1
Run Code Online (Sandbox Code Playgroud)
如果相关的话,这是专门针对 SQL Server 2008 的。
我看到有 3 种方法可以做到这一点,但都涉及UNION ALL
:
你的版本`:
SELECT
T1.C1, ....., T1.CN,
T2.C1, ..., T2.CM
FROM
Table1 T1 JOIN Table2 T2
ON T1.Key1 = T2.Key1
UNION ALL
SELECT
T1.C1, ..., T1.CN,
NULL, ... NULL
FROM
Table1 T1 ;
Run Code Online (Sandbox Code Playgroud)稍微改变第二部分:
SELECT
T1.C1, ....., T1.CN,
T2.C1, ..., T2.CM
FROM
Table1 T1 JOIN Table2 T2
ON T1.Key1 = T2.Key1
UNION ALL
SELECT
T1.C1, ....., T1.CN,
T2.C1, ..., T2.CM
FROM
Table1 T1 LEFT JOIN Table2 T2
ON 0 = 1 ; -- FALSE
Run Code Online (Sandbox Code Playgroud)首先 a UNION
,然后加入:
SELECT
T1.C1, ....., T1.CN,
T2.C1, ..., T2.CM
FROM
Table1 T1 JOIN
( SELECT * FROM T2
UNION ALL
SELECT NULL, ..., NULL
) AS T2
ON T1.Key1 = T2.Key1
OR T2.Key1 IS NULL ;
Run Code Online (Sandbox Code Playgroud)我认为执行计划和效率不会有太大差异,但第一个似乎更简单。
归档时间: |
|
查看次数: |
7056 次 |
最近记录: |