Как в запросе выбрать запись из одной таблицы по признаку из другой?

Есть таблица RECORDS. На нее ссылается другая таблица ASSESSMENTпо FK столбец RECORD_ID на RECORDS.ID. Одной записи в RECORDS может соответствовать несколько записей в ASSESSMENT. В ASSESSMENT есть также столбец COLOR, который в свою очередь ссылается на таблицу DICTIONARY. В DICTIONARY каждому COLOR соответствует приоритет COLOR.priority.

Как я могу извлечь для заранее известного ID записи из таблицы RECORDS одну запись из ASSESMENT с наименьшим значением приоритета цвета?

Например: имеем запись в RECORD

create table records (id) as 
    select 1 from dual

, ей соответствуют две записи в ASSESMENT:

create table assessment (id, record_id, color) as
    select 1, 1, 'red'   from dual union all
    select 2, 1, 'blue ' from dual

, а в таблице DICTIONARY дано:

create table dictionary (color, priority) as 
    select 'red',   1 from dual union all
    select 'blue',  2 from dual union all
    select 'green', 3 from dual

Нужно получить только запись с наименьшим значением приоритета, то есть у которой RECORD_ID = 1, COLOR='red'

Эту запись потом нужно будет соединить с другими, то есть обернуть это все в JOIN.


Ответы (1 шт):

Автор решения: 0xdb
select r.id, a.color
from records r
cross apply (
    select max (a.color) keep (dense_rank first order by prio) color
    from assessment a, dictionary d
    where a.record_id = r.id 
    and   d.color = a.color ) a;

        ID COLOR
---------- -----
         1 red  

С тестовыми данными на db<>fiddle. Для версий 11g и старше.

→ Ссылка