如何实现SQL LEFT JOIN:优先匹配Name字段,失败则匹配ID字段
多优先级关联查询需求与SQL实现
需求描述
现有两张业务表:
- Favorite Foods表(表1):存储所有人员的基础信息及喜好食物数据
- Contacts表(表2):存储人员的联系方式(邮箱、电话号码)
需要实现的查询逻辑:
- 取出Favorite Foods表中的全部人员数据
- 从Contacts表匹配对应人员的联系方式:优先通过Name字段匹配;若Name匹配无结果,则通过ID字段匹配
注:原本在Excel中可通过嵌套IFNA的VLOOKUP函数实现该逻辑,但因数据量过大无法用Excel处理,自行编写的伪代码存在语法问题。
问题伪代码
select * from People LEFT JOIN Contacts ON People.Name == Contacts.Name, if Null, then LEFT JOIN Contacts ON People.ID == Contacts.ID
正确SQL实现方案
可以通过两次左连接+COALESCE函数实现优先级匹配逻辑,具体写法如下:
SELECT ff.*, -- 优先取Name匹配到的邮箱,无结果则取ID匹配到的邮箱 COALESCE(c1.Email, c2.Email) AS Email, -- 优先取Name匹配到的电话,无结果则取ID匹配到的电话 COALESCE(c1.Phone, c2.Phone) AS Phone FROM `Favorite Foods` ff -- 第一次按Name字段左连接联系人表 LEFT JOIN Contacts c1 ON ff.Name = c1.Name -- 第二次按ID字段左连接联系人表 LEFT JOIN Contacts c2 ON ff.ID = c2.ID
逻辑说明
- 先通过Name字段关联Contacts表,得到优先匹配的联系方式(c1)
- 再通过ID字段关联Contacts表,得到兜底匹配的联系方式(c2)
- 利用
COALESCE函数的特性:优先返回第一个非空值,完美实现"Name优先,ID兜底"的匹配规则
内容的提问来源于stack exchange,提问作者Ben
相关产品推荐
相关产品推荐

