2015-11-03 11 views
0

У меня есть SQL запрос, который выглядит следующим образом:Используя условие с левой включается в PostgreSQL

DELETE FROM survey_subjects WHERE id IN (
    SELECT ss.id FROM survey_subjects ss 
    LEFT JOIN survey_instances si ON si.survey_subject_id = ss.id 
    LEFT JOIN survey_packs sp ON si.survey_pack_id = sp.id 
    LEFT JOIN school_packs scp ON sp.school_pack_id = scp.id 
    LEFT JOIN survey_orders so ON scp.survey_order_id = so.id AND so.administration_id = <administration_id> 
    WHERE ss.administration_id = <administration_id> AND si.id IS NULL 
); 

Я думал, как я могу сделать этот запрос более читаемым. Я думал об использовании предложения USING из PostgreSQL, но он не будет работать для левых соединений. Есть ли способ сделать его более читаемым?

+0

'использование' конечно конечно работа для левого соединения. Но: 'использование' применимо только в том случае, если столбцы объединения имеют одинаковое имя в обеих таблицах, что явно не соответствует вашим таблицам. –

ответ

2

Я думаю, вы должны упростить логику к этому:

DELETE FROM survey_subjects WHERE id IN (
    SELECT ss.id 
    FROM survey_subjects ss LEFT JOIN 
     survey_instances si 
     ON si.survey_subject_id = ss.id 
    WHERE ss.administration_id = <administration_id> AND si.id IS NULL 
); 

Дополнительные join s ничего не делает. Они не фильтруют данные (потому что соединения - это левые соединения). Они не влияют ни на одну колонку в разделе WHERE, ни на столбец в SELECT.

Смежные вопросы