SELECT Person_Name,
COALESCE(
(SELECT Phone_Number FROM phone WHERE Person_Name = p.Person_Name AND Phone_Type = 'PC'),
(SELECT Phone_Number FROM phone WHERE Person_Name = p.Person_Name AND Phone_Type = 'P'),
(SELECT Phone_Number FROM phone WHERE Person_Name = p.Person_Name AND Phone_Type = 'F')
) AS Phone_Number
FROM (
SELECT DISTINCT Person_Name
FROM phone
) p;
让我们分解一下:
最里面的子查询从电话表中选择所有不同的人名。
查询的中间部分使用 COALESCE 返回三个子查询中的第一个非空值。子查询查找具有指定电话类型的给定人员的电话号码,顺序为 Personal Cell、Permanent 和 Fax。如果个人手机号码不可用,则查询返回到永久号码,如果该号码也不可用,则查询返回到传真号码。
最外层的查询选择由前一个子查询生成的 Person_Name 和 Phone_Number 列。
此查询应返回一个表,每个人一行,并根据个人手机、永久和传真的优先顺序返回相应的电话号码。