【问题标题】: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 的用户名而不是全名

【问题讨论】:

标签: sql oracle join left-join inner-join


【解决方案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;
    

    【讨论】:

      猜你喜欢
      • 2011-06-25
      • 1970-01-01
      • 2015-08-10
      • 1970-01-01
      • 2011-08-15
      • 1970-01-01
      • 2020-08-25
      • 2019-10-04
      • 2017-11-30
      相关资源
      最近更新 更多