#mysql #sql
Вопрос:
У меня есть два стола
Один из них-Кэтгори
Category Value
ABC 1
DEF 2
ALL 3
Работа за вторым столом
JOB Category
123 ABC
234 DEF
456 GGG
778 TTT
Мне нужно добавить объединение этих двух таблиц в категорию. Но мне нужен ответ, как показано ниже
JOB VALUE
123 1
234 2
456 3
778 3
В принципе, если категория совпадает, то этому присваивается значение. Но если в столбце категории есть ВСЕ и имеет значение, то, если категория не совпадает, отображается значение для ВСЕХ для несопоставимого значения, как в примере заданий 456 и 778.
Комментарии:
1. Подсказка:
LEFT JOIN
,COALESCE()
.
Ответ №1:
Вы можете использовать два left join
s:
select j.*, coalesce(c.value, c_default.value) as value
from job j left join
category c
on j.category = c.category left join
category c_default
on c_default.category = 'ALL';
Вы также можете использовать коррелированный подзапрос:
select j.*,
(select c.value
from category c
where c.category in ('ALL', j.category)
order by (c.category = j.category) desc
limit 1
) as value
from job j;
Ответ №2:
Используйте outer join
и coalesce
select job, Coalesce(c.value, (select value from category where category='ALL')) as value
from job j
left join category c on c.category=j.category
Вы также можете использовать a window function
для ранжирования соответствующих и несоответствующих категорий
with j as (
select j.job, c.value, Row_Number() over(partition by job order by case when c.category='all' then 1 else 0 end) rn
from job j
join category c on c.category=j.category or c.category='ALL'
)
select job,value
from j
where rn=1