我需要能够显示第二个表中实际不存在的行的结果。我尝试了左连接,但它似乎并不适用于我需要做的事情。我有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时,我必须手动粘贴它们
有什么想法吗?我真的以为我应该可以通过左连接来做到这一点,但我所做的一切似乎都没有用。
答案 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]