is_deleted, которая содержит true/false
я эту таблицу хочу приджойнить к другой
вопрос, где лучше прописывать условие is_deleted=false?
для себя нашёл три варианта, но не знаю, какой будет оптимальным
вариант 1
select * from table1 t1
left join table2 t2
on t2.id = t1.t2_fk
where t2.is_deleted = false
вариант 2
select * from table1 t1
left join table2 t2
on t2.id = t1.t2_fk and t2.is_deleted = false
вариант 3
select * from table1 t1
left join (select * from table2 where table2.is_deleted = false) t2
on t2.id = t1.t2_fk
вроде бы все три варианта дают одно и тоже
сравните планы запросов 1 и 2 вроде вообще не будут отличаться насчет 3 не уверен
третий вариант обычно никто не использует без особой необходимости, но работать он будет как вариант2, первые два - это вообще разные запросы. Если в table1.t2_fk будет ссылка на удалённую запись, то: вариант1: вы получите строчку в которой все поля из t1 будут null (да и вообще, left join здесь работает как inner join, т.е., строки с table1.t2_fk = null не вернутся) вариант2: соответствующая строчка не вернётся. И еще одно замечание: лучше писать не is_deleted = false, а not is_deleted
Во втором случае у тебя ужэ не outer (left) join, это inner join. А так первый и третий одинаковы для планировщика, второй можэт дать другие планы из-за других результатов, а в остальном — одинаков.
Обсуждают сегодня