sql - 如果存在则从表 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
解决方案
我正在考虑两个左连接和条件逻辑:
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 |
推荐阅读
- python - 如何在文件上使用 write() 方法而不替换字符?
- c - Codeforces:“B. 8 Queens, Again”
- dns - DNS 区域文件位于何处?
- android - 在 android/Xamarin.Android 中单击通知时切换到正在运行的活动
- java - 使用 Java 流从集合中获取两个最小对象
- node.js - 当值不在数组中时,猫鼬 findOneAndUpdate
- makefile - 在 CMAKE for Protobuf 中使用 distcc 时未定义的引用
- java - 具有连接表的单个实体上的多对多
- arrays - JSONata 按数组排序/排序
- python - 如何在 pandas python 中转换 11:54 的 1154 时间格式?