一个表中的输出行在另一个表中不存在匹配项

Posted

技术标签:

【中文标题】一个表中的输出行在另一个表中不存在匹配项【英文标题】:Output rows in one table for which no match exists in another 【发布时间】:2014-12-26 15:24:23 【问题描述】:

我有两张桌子:scanspersonel。在scans 中有一个createdby 列,其中创建扫描的人的用户名在那里。我需要创建一个视图来查看这些扫描,但不是用户名,而是我想查看我在表personel 中拥有的那个人的全名。这个查询最有效:

select personel.firstname ||' '|| personel.lastname as CREATEDBY
from scans inner join personel on scans.createdby = personel.username;

问题是scans.createdby 中有一些用户名不再出现在personel 表中,并且由于createdby 列中的值与username 列中的任何值。

因此,对于这种情况,我想为这些扫描输出来自 createdby 的值。

如果:

scans.createdby = personel.username => 显示全名

但如果:

scans.createdby 不匹配任何personel.username => 显示来自scans.createdby 的用户名而不是全名

【问题讨论】:

请参阅this answer 到 SO 问题 mysql - How do I decide when to use right joins/left joins or inner joins Or how to determine which table is on which side? 【参考方案1】:
select ifnull(personel.firstname + ' ' + personel.lastname, scan.createdby) as CREATEDBY
from scans 
LEFT join personel on scans.createdby = personel.username;

【讨论】:

实际上,对于最后一个版本,当没有用户名时,我会得到空条目。在修订之前很好:) 还必须对 oracle 使用 NVL 函数而不是 ISNULL,但这是我之前没有指定的坏处。谢谢你的回答!【参考方案2】:

您想要从scanspersonel 的左连接,并且您应该使用合并运算符(例如,SQL Server 中的ISNULLCOALESCE)或函数在查询结果中创建CREATEDBY 列。

【讨论】:

【参考方案3】:
select case when personel.username is null then scans.createdby else personel.firstname ||' '|| personel.lastname end as CREATEDBY
from scans left outer join personel on scans.createdby = personel.username;

【讨论】:

以上是关于一个表中的输出行在另一个表中不存在匹配项的主要内容,如果未能解决你的问题,请参考以下文章

查询输出表中不存在的值

连接后,表中的两行在另一个表中显示为两个不同的列

SQL连接(join)

即使不是一个表中的所有行在另一个表中都有核心响应者,如何从 MySQL 中的两个表中进行选择?

从表中选择行,其中具有相同 id 的另一个表中的行在另一列中具有特定值

定义表中不存在时删除 jsonb 键