满足条件时自我引用SQL查询

时间:2014-08-27 05:32:51

标签: sql

我正在尝试创建一个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列。这是另一个人的关键。对于那些在下班休假期间代表他人工作的人。

因此,我们到达了我的问题:如何修改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 |
+----+-----------+----------+---------+-------------+


凯文在这里代表约翰,迈克尔也是程序员,所以我的查询结果应该是:

+----+-------------------------+
| id |          NAME           |
+----+-------------------------+
|  1 | John Smith - Kevin Tull |
|  3 | Michael Woods           |
|  x | Other Programmers..     |
+----+-------------------------+

2 个答案:

答案 0 :(得分:0)

此未经测试的查询应该为您提供所需的结果:

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'

答案 1 :(得分:0)

使用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。使用INNER JOIN