进行左连接并使每个匹配项都包含一个额外的空行

Law*_*gle 6 join sql-server

所以我想做一个左连接,让左表中的每一行都在右表中包含一行空值,即使存在匹配也是如此。

这种类型的连接有名称吗?

有没有比我下面的方法更好的方法(即避免联合)?

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 的。

ype*_*eᵀᴹ 4

我看到有 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)

我认为执行计划和效率不会有太大差异,但第一个似乎更简单。