Создана структура таблиц указанная на изображении. Необходимо выполнить запрос указанный изображении. Какой вид join необходимо использовать на месте пропуска [...], чтобы в результате для записей с

В данном запросе нужно получить данные из двух таблиц (tableaw и table2), но для каждой записи из multirelation только одна из колонок (naming или serialnumber) должна быть заполнена в зависимости от значения type.

Короткий ответ

Что ответить на собеседовании

В данном запросе нужно получить данные из двух таблиц (tableaw и table2), но для каждой записи из multirelation только одна из колонок (naming или serialnumber) должна быть заполнена в зависимости от значения type.

Подробный разбор

Ответ с пояснениями

Условие

Создана структура таблиц указанная на изображении. Необходимо выполнить запрос указанный изображении. Какой вид join необходимо использовать на месте пропуска [...], чтобы в результате для записей с

type = 'table_aw' была заполнена колонка 'naming', а для записей с type = 'table2' — колонка 'serial_number'?

create table multirelation( type varchar not null, entity_id integer not null ); create table table_aw( id integer primary key, naming varchar not null ); create table table2( id integer primary key, serial_number varchar not null ); -- структура таблиц select m.type,m.entity_id, ta.naming, t2.serial_number from multirelation m [...] join table_aw ta on m.entity_id = ta.id and m.type='table_aw' [...] join table2 t2 on m.entity_id = t2.id and m.type='table2'; -- запрос

Оставить пустым inner cross right left

Ответ

В данном запросе нужно получить данные из двух таблиц (table_aw и table2), но для каждой записи из multirelation только одна из колонок (naming или serial_number) должна быть заполнена в зависимости от значения type.

Если использовать INNER JOIN, то записи, у которых type не совпадает с условием соединения, будут отфильтрованы, и мы потеряем нужные строки.

Если использовать CROSS JOIN, то будет произведено декартово произведение, что не подходит.

LEFT JOIN позволяет сохранить все записи из левой таблицы (multirelation), а данные из правой таблицы будут подставлены, если условие совпадает, иначе — NULL.

Поэтому на месте пропусков нужно использовать LEFT JOIN:

select m.type, m.entity_id, ta.naming, t2.serial_number
from multirelation m
left join table_aw ta on m.entity_id = ta.id and m.type = 'table_aw'
left join table2 t2 on m.entity_id = t2.id and m.type = 'table2';

Так для записей с type = 'table_aw' будет заполнена колонка naming, а для type = 'table2' — serial_number.

Практика в реальном времени

Подготовьтесь к следующему собеседованию

Interview Boost учитывает вакансию, резюме и технологии и помогает сформулировать ответ прямо во время интервью.

Начать подготовку