SQL |当第二张表没有匹配行时左连接?

时间:2016-05-23 23:27:11

标签: sql left-join union-all

我需要能够显示第二个表中实际不存在的行的结果。我尝试了左连接,但它似乎并不适用于我需要做的事情。我有2个表,例如:

Table1
NAME | KEY
John 12345
Frank 23456

Table2
KEY | LIST | STATUS
12345 10001 1
12345 10003 0
23456 10001 1
23456 10002 1

我需要能够显示这样的结果:

NAME | KEY | LIST | STATUS
John 12345 10001 1
John 12345 10002 (null)
John 12345 10003 0
Frank 23456 10001 1
Frank 23456 10002 1
Frank 23456 10003 (null)

但是我无法弄清楚如何执行此操作,因为返回空值的记录实际上并不存在于第二个表中。如果我一次一个地运行它们,我可以通过执行UNION ALL来获得我需要的结果,但是效率不高(我还必须重新排序我的结果,这也使得它更难)

SELECT b.list, a.name, a.key, b.status
FROM table1 a JOIN table2 b ON a.key = b.key
WHERE a.name = 'John'
UNION ALL
SELECT distinct(b.list), NULL AS "a.name", NULL AS "a.key", NULL AS "b.status"
FROM table2 b

这不是一个理想的解决方案,因为我拉动其余列表,但其他字段最终为空,所以当我将结果移到excel时,我必须手动粘贴它们

有什么想法吗?我真的以为我应该可以通过左连接来做到这一点,但我所做的一切似乎都没有用。

3 个答案:

答案 0 :(得分:3)

使用cross join获取所有行。然后使用left join引入现有值:

select t1.key, l.list, t2.status
from table1 t1 cross join
     (select distinct list from table2) l left join
     table2 t2
     on t1.key = t2.key and t1.list = t2.list;

答案 1 :(得分:0)

尝试FULL OUTER JOIN

示例:

SELECT A.NAME, A.KEY, A.LIST, B.STATUS
FROM Table1 A 
FULL OUTER JOIN Table2 B
ON A.KEY = B.KEY AND A.LIST = B.LIST

如果不想在第一个表中没有引用的第二个表的行添加条件:

WHERE A.KEY IS NOT NULL

答案 2 :(得分:0)

这是我想出的。前两个查询用于将NAME,KEY和LIST的所有可能组合组合在一起。最终查询连接回Table2以获取STATUS,返回NULL,其中STATUS不存在。

;WITH Lists
AS
(
    SELECT DISTINCT LIST 
    FROM Table2
),
KeyList AS
(
    SELECT [NAME], [KEY],  [LIST]
    FROM Lists CROSS JOIN Table1
)   
SELECT a.[NAME], a.[KEY],A.[LIST],b.[STATUS] 
FROM KeyList a
LEFT JOIN Table2 b
ON a.[KEY] = b.[KEY]
AND a.[LIST] = b.[LIST]