在空 LEFT JOIN 上加入特定行

Join specific row on null LEFT JOIN

我有两个 tables 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 已过时(用户不再存在于 table)所以 LEFT JOIN returns NULL。

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

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

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

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