Sql 空左联接上的联接特定行

Sql 空左联接上的联接特定行,sql,tsql,sql-server-2008,join,left-join,Sql,Tsql,Sql Server 2008,Join,Left Join,我有两个表项和用户 我想创建与所有者的视图,他们是特定项目的经理、主管等 例如: 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是过时的(表中不再存在用户),所以

我有两个表用户

我想创建与所有者的视图,他们是特定项目的经理、主管等

例如:

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

可能吗?我想这样做,所以我不必手动更新manager、director等。

您可以使用另一个
左连接添加默认值:

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。首先声明外键关系。其次,您可能需要考虑“软”删除(设置标志)而不是实际删除行。