首页 > 解决方案 > 如果存在则从表 A 中获取值,否则从表 B 中获取值。如果找到多个值,则返回 MT 以指示多种类型

问题描述

如果存在则从表 A 中获取值,否则从表 B 中获取值。如果找到多个值,则返回 MT 以指示多种类型。

例如,如果尝试查找具有 'c' 且 type = 'SW' 的名称

预计会出现以下结果

Name   | NUM | ID   | TYPE
--------------------------
Carrot | 789 | C456 | MT
Celery | 891 | E891 | SW

小提琴 https://www.db-fiddle.com/f/ipmwJwpru4ZmroGQJwpdjP/0

餐桌

Name   | NUM | ID
-------------------
Apple  | 123 | A234
Orange | 456 | B789
Carrot | 789 | C456
Cherry | 234 | D123
Celery | 891 | E891

Number_type 表

NUM | TYPE
----------
123 | SR 
123 | AD 
456 | SW
567 | SP
891 | SW

ID_type 表

ID   | TYPE
-----------
A234 | SW 
B789 | AD 
C456 | SW
D123 | SP
C456 | AD
E891 | FJ

预期成绩

Name   | NUM | ID   | TYPE
--------------------------
Apple  | 123 | A234 | MT
Orange | 456 | B789 | SW
Carrot | 789 | C456 | MT
Cherry | 234 | D123 | SP
Celery | 891 | E891 | SW

标签: sqlsqlite

解决方案


我正在考虑两个左连接和条件逻辑:

select
    f.name,
    f.num,
    f.id,
    case when coalesce(n.min_type, i.min_type) = coalesce(n.max_type, i.max_type)
        then coalesce(n.min_type, i.min_type)
        else 'MT'
    end as type
from food f
left join (
    select num, min(type) min_type, max(type) max_type
    from number_type 
    group by num
) n on n.num = f.num
left join (
    select id, min(type) min_type, max(type) max_type
    from id_type 
    group by id
) i on i.id = f.id and n.num is null
where n.num is not null or i.id is not null

您的 db fiddle中,这会产生:

| name   | num | id   | type |
| ------ | --- | ---- | ---- |
| Apple  | 123 | A234 | MT   |
| Cherry | 234 | D123 | SP   |
| Orange | 456 | B789 | SW   |
| Carrot | 789 | C456 | MT   |
| Celery | 891 | E891 | SW   |

推荐阅读