[英]Self Referencing SQL query when condition is met
我正在嘗試創建一個SQL查詢,以從滿足某些條件的表中返回列值。
目前,對於具有“程序員”角色的員工,我已經使用CONCAT函數將名字和姓氏連接到查詢結果的單個列中。
SELECT
person.id, CONCAT(person.firstname,' ', person.lastname) AS FULLNAME
FROM
person, role
WHERE
person.role_id = role.id AND role.name = 'Programmer'
這將成功運行並返回表中的所有程序員。 注意,在我的表結構中,我有一個actingas_id
列。 這是另一個person.id的鑰匙,適用於在休假時代表另一個人工作的人。
因此,我們想到了一個問題:如何修改SQL查詢,以便當某人執行操作時 ,該查詢會檢索該人的名字和姓氏以及“正在填充鞋子”的人?
我的表結構如下:
人: id | 名| 姓| role_id | actingas_id |
角色: id | 名稱|
+----+-----------+----------+---------+-------------+
| id | firstname | lastname | role_id | actingas_id |
+----+-----------+----------+---------+-------------+
| 1 | John | Smith | 1 | 0 |
| 2 | Kevin | Tull | 2 | 1 |
| 3 | Michael | Woods | 1 | 0 |
+----+-----------+----------+---------+-------------+
這里Kevin是John的代理人,而Michael也是程序員,所以我的查詢結果應該是:
+----+-------------------------+
| id | NAME |
+----+-------------------------+
| 1 | John Smith - Kevin Tull |
| 3 | Michael Woods |
| x | Other Programmers.. |
+----+-------------------------+
這個未經測試的查詢應該給您您想要的結果:
SELECT person1.id, CASE WHEN person1.actingas_id =0 then CONCAT(person1.firstname,' ', person1.lastname) else CONCAT(person1.firstname,' ', person1.lastname,' - ', person2.firstname,' ', person2.lastname) AS FULLNAME
FROM person person1 left join person person2 on person1.actingas_id=person2.id
join role on person1.role_id=role.id
WHERE role.name = 'Programmer'
使用UNION ALL
添加這些附加記錄:
SELECT person.id,
CONCAT(person.firstname,' ', person.lastname) AS FULLNAME
FROM person INNER JOIN role
ON person.role_id = role.id
WHERE role.name = 'Programmer'
AND NOT EXISTS(SELECT 1 FROM person p WHERE p.actingas_id = person.id)
UNION ALL
SELECT a.id,
CONCAT(a.firstname,' ', a.lastname, ' - ', person.firstname,' ', person.lastname) AS FULLNAME
FROM person INNER JOIN person a
ON a.acting_as = person.id
INNER JOIN role
ON person.role_id = role.id
WHERE role.name = 'Programmer' AND a.actingas_id <> 0
另外,請避免使用舊的逗號分隔的JOIN。 使用內部聯接
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.