首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >SQL |当第二个表没有匹配的行时左联接?

SQL |当第二个表没有匹配的行时左联接?
EN

Stack Overflow用户
提问于 2016-05-24 07:27:11
回答 3查看 135关注 0票数 1

我需要能够显示实际上不存在于第二个表中的行的结果。我尝试过left join,但它似乎不能满足我的需要。我有两个表,例如:

代码语言:javascript
复制
Table1
NAME | KEY
John 12345
Frank 23456

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

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

代码语言:javascript
复制
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得到我需要的结果,但这并不高效(我还必须重新排序我的结果,这也使得它变得更加困难)。

代码语言:javascript
复制
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中时,我必须手动粘贴它们。

有什么想法吗?我真的认为我应该能够使用左连接来做这件事,但是我所做的似乎都不起作用。

EN

回答 3

Stack Overflow用户

发布于 2016-05-24 07:35:06

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

代码语言:javascript
复制
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;
票数 3
EN

Stack Overflow用户

发布于 2016-05-24 07:34:54

尝试完全外部联接

示例:

代码语言:javascript
复制
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

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

代码语言:javascript
复制
WHERE A.KEY IS NOT NULL
票数 0
EN

Stack Overflow用户

发布于 2016-05-25 05:01:15

这是我想出来的。前两个查询用于获取名称、键和列表的所有可能组合。最后一个查询连接回Table2以获取状态,在状态不存在的情况下返回NULL。

代码语言:javascript
复制
;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]
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37402092

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档