簡體   English   中英

滿足條件時的自引用SQL查詢

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM