一个表中的输出行在另一个表中不存在匹配项
Posted
技术标签:
【中文标题】一个表中的输出行在另一个表中不存在匹配项【英文标题】:Output rows in one table for which no match exists in another 【发布时间】:2014-12-26 15:24:23 【问题描述】:我有两张桌子:scans
和 personel
。在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】:您想要从scans
到personel
的左连接,并且您应该使用合并运算符(例如,SQL Server 中的ISNULL
或COALESCE
)或函数在查询结果中创建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;
【讨论】:
以上是关于一个表中的输出行在另一个表中不存在匹配项的主要内容,如果未能解决你的问题,请参考以下文章
即使不是一个表中的所有行在另一个表中都有核心响应者,如何从 MySQL 中的两个表中进行选择?