在空 LEFT JOIN 上加入特定行
Join specific row on null LEFT JOIN
我有两个 tables items 和 users.
我想创建特定项目的所有者及其经理、主管等的视图。
示例:
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。首先声明外键关系。其次,您可能需要考虑“软”删除(设置标志)而不是实际删除行。
我有两个 tables items 和 users.
我想创建特定项目的所有者及其经理、主管等的视图。
示例:
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。首先声明外键关系。其次,您可能需要考虑“软”删除(设置标志)而不是实际删除行。