присоединяйтесь к двум столам с совпадением и без совпадения

#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