SQL查询需求:优先取TableB数据,无匹配时仅用TableA数据
解决方案:优先匹配TableB, fallback到TableA的查询
先明确我们的三张表结构(你给出的示例数据):
Table A
| IDA | Name |
|---|---|
| 1 | John |
| 2 | Jonas |
| 3 | Carl |
| 4 | Foo |
| 5 | Bar |
| 6 | Dog |
Table B
| IDB | Name |
|---|---|
| 1 | Bob |
| 2 | Lisa |
Table MAIN
| ID | FKtoB | FKtoA |
|---|---|---|
| 1 | 1 | 4 |
| 2 | 3 | |
| 3 | 1 | |
| 4 | 2 | 6 |
| 5 | 2 | |
| 6 | 5 |
要实现优先使用TableB的匹配数据,无匹配时用TableA的需求,我们可以利用LEFT JOIN关联两张表,再用COALESCE()函数优先选取非空的高优先级数据,具体SQL如下:
SELECT m.ID, COALESCE(b.Name, a.Name) AS PriorityName, m.FKtoB, m.FKtoA FROM MAIN m LEFT JOIN TableB b ON m.FKtoB = b.IDB LEFT JOIN TableA a ON m.FKtoA = a.IDA;
执行结果
运行这条SQL后会得到如下结果:
| ID | PriorityName | FKtoB | FKtoA |
|---|---|---|---|
| 1 | Bob | 1 | 4 |
| 2 | Carl | 3 | |
| 3 | John | 1 | |
| 4 | Lisa | 2 | 6 |
| 5 | Jonas | 2 | |
| 6 | Bar | 5 |
逻辑解释
LEFT JOIN TableB b ON m.FKtoB = b.IDB:保留MAIN表的所有行,同时关联TableB中匹配的记录;如果MAIN的FKtoB为空或无对应IDB,b.Name会返回NULLLEFT JOIN TableA a ON m.FKtoA = a.IDA:同样保留MAIN所有行,关联TableA的匹配记录(根据示例数据,MAIN的FKtoA都有对应IDA,所以a.Name始终有值)COALESCE(b.Name, a.Name):这个函数会依次返回第一个非空的值,完美实现了"优先用TableB,没有则用TableA"的优先级规则
内容的提问来源于stack exchange,提问作者Kevin Böhmer
相关产品推荐
相关产品推荐

