delete + join

Legushka
Дата: 26.01.2015 08:35:49
помогите написать запрос по удалению из первой таблицы где есть связь inner join всех связанных по ИД записей со второй таблицей

т.е. select t1.* from tab1 t1 inner join tab2 t2 (t1.poleid=t2.tab1id) работает
А DELETE tab1 t1 inner join tab2 t2 (t1.poleid=t2.tab1id) НЕ РАБОТАЕТ

если писать запрос так: DELETE tab1 t1 where t1.poleid in (select t2.tab1id) from tab2 t2)
то план выполнения ужасный - для каждой записи из t1 идет обращение к таблице t2

версия
PostgreSQL 9.1.14 on x86_64-unknown-linux-gnu, compiled by gcc (GCC) 4.4.7 20120313 (Red Hat 4.4.7-4), 64-bit
Maxim Boguk
Дата: 26.01.2015 08:43:12
Legushka
если писать запрос так: DELETE tab1 t1 where t1.poleid in (select t2.tab1id) from tab2 t2)
то план выполнения ужасный - для каждой записи из t1 идет обращение к таблице t2


интересно а какой собственно вы план хотите для такой задачи?
От того что вы запрос перепишите далеко не факт что план изменится.
Приведите explain analyze для начала как я уже много раз предлагал вам вместо невнятных жалоб.

--Maxim Boguk
www.postgresql-consulting.ru
Добрый Э - Эх
Дата: 26.01.2015 08:46:34
Legushka,

Какой-то у тебя эм-эс эс-ку-эль-ный акцент в синтаксисе запроса.
В постгре, если что, нужно писать DELETE ... USING.
Подробности, не поверишь, в документации...
этта
Дата: 26.01.2015 10:14:01
Добрый Э - Эх,
присоединяюсь к USING , но "negative loop" anti-join он не охватывает
приходится разнообразить not--exists-ом


-- откуда морал -- мс-скльный синтакс поширше будет, поуниверсальней. (хоть и мастдай).
а пж опять таки обосра облажалси, выбрав к реализации половинчатый ущербный синтакс.


план да -- можно бы привести, как вариант, когда табла2 узкая -- можно WHERE t1.id=ANY(ARRAY(SELECT id FROM tab2)) -- там какая-то разница возникает в планах. не факт, что полезная