左连接保留NULL记录

时间:2014-11-23 20:44:51

标签: sql tsql left-join

说我有这些表:

TableA        TableB:
id name       id  name
-- ----       --  ----
1  Pirate     1   Rutabaga
2  Monkey     2   Pirate
3  Ninja      3   Darth Vader
4  Spaghetti  4   Ninja

当我Left Join时,我得到以下内容:

SELECT * FROM TableA
LEFT OUTER JOIN TableB
ON TableA.name = TableB.name

id  name       id    name
--  ----       --    ----
1   Pirate     2     Pirate
2   Monkey     null  null
3   Ninja      4     Ninja
4   Spaghetti  null  null

但我想要的是一个不同的" Left Join " ,我得到以下内容:

id  name       id    name
--  ----       --    ----
1   Pirate     2     Pirate
1   Pirate     null  null
2   Monkey     null  null
3   Ninja      4     Ninja
3   Ninja      null  null
4   Spaghetti  null  null

我如何获得这个增强的" Left Join " ,它会返回所有左表条目的空记录以及连接的值?

2 个答案:

答案 0 :(得分:2)

听起来我觉得这就是你要找的东西:

SELECT TableA.id, TableA.name, TableB.id, TableB.name 
FROM TableA
INNER JOIN TableB
    ON TableA.name = TableB.name
UNION
SELECT id, name, null, null 
FROM TableA

请注意,您不需要LEFT JOIN,因为第二个查询不需要这样做。您要求INNER JOIN结果以及包含TableA数据的TableB数据的记录。

答案 1 :(得分:0)

您将使用union all。当然,ids存在问题。这样的事情可能有用:

select row_number() over (order by (select NULL)) as id, name, bid, bname
from ((select a.id, a.name, b.id as bid, b.name as bname
       from tableA a inner join
            tableB b
            on a.name = b.name
      ) union all
      (select a.id, a.name, NULL, NULL
       from tableA a
      )
     ) ab;

这不会保留第一个id列。但话说回来,很难说这是为了什么。

编辑:

实际上,这可能会以您希望的方式保留它:

select id, name, bid, bname
from ((select a.id, a.name, b.id as bid, b.name as bname
       from tableA a inner join
            tableB b
            on a.name = b.name
      ) union all
      (select a.id + (max(id) over ()), a.name, NULL, NULL
       from tableA a
      )
     ) ab;