【问题标题】:Join specific row on null LEFT JOIN在空 LEFT JOIN 上加入特定行
【发布时间】:2021-06-20 05:07:28
【问题描述】:

我有两个表 itemsusers

我想与所有者及其经理、主管等创建特定项目的视图。

示例:

SELECT Name, OwnerId, owner.FirstName, manager.FirstName
FROM items
LEFT JOIN users as owner ON owner.id = OwnerId
LEFT JOIN users as manager ON manager.id = owner.ManagerId

现在有些项目是旧的并且 OwnerId 已经过时(用户不再存在于表中)所以 LEFT JOIN 返回 NULL。

在这种情况下,我想从 users 表中分配特定用户。

SELECT Name, OwnerId, owner.FirstName, manager.FirstName
FROM items
LEFT JOIN users as owner 
  ON owner.id = OwnerId --WHEN owner is null THEN owner ON owner.id = (SELECT * FROM users WHERE Id = 123)
LEFT JOIN users as manager ON manager.id = owner.ManagerId

有可能吗?我想这样做,所以我不必手动更新经理,主管等。

【问题讨论】:

    标签: sql tsql sql-server-2008 join left-join


    【解决方案1】:

    您可以使用另一个 LEFT JOIN 添加默认值:

    SELECT i.Name, i.OwnerId,
           COALESCE(uo.FirstName, ud.FirstName) as owner_firstname,
           um.FirstName as manager_firstname
    FROM items i LEFT JOIN
         users uo
         ON uo.id = i.OwnerId LEFT JOIN
         users ud
         ON ud.id = 123 LEFT JOIN
         users um
         ON um.id = COALESCE(uo.ManagerId, ud.ManagerId);
    

    注意事项:

    • 这也使用默认的经理名称。
    • SELECT 区分返回的两个名称。
    • 您的表格别名很好,但表格缩写更容易输入。
    • 您应该修复您的数据模型,这样您就没有悬空的 ID。首先声明外键关系。其次,您可能需要考虑“软”删除(设置标志),而不是实际删除一行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-02-06
      • 1970-01-01
      • 1970-01-01
      • 2018-07-27
      • 1970-01-01
      • 1970-01-01
      • 2014-06-10
      相关资源
      最近更新 更多