PostgreSQL: обновление с левым внешним самостоятельным соединением игнорируется - PullRequest
3 голосов
/ 07 января 2012

Я хочу обновить столбец leaf_category с TRUE, где категория не является родительской категорией. Он работает как оператор выбора:

 select 
     c1.id, c1.name, c1.slug, c1.level, c2.parent_id, c2.name, c2.slug, c2.level 
 from
     catalog_category c1 
 left outer join 
     catalog_category c2 on 
     (c1.id = c2.parent_id)
 where 
     c2.parent_id is null;

Однако соответствующий UPDATE устанавливает для всех столбцов значение TRUE.

update catalog_category 
set leaf_category = True
from
    catalog_category c1 
left outer join 
    catalog_category c2 on 
    (c1.id = c2.parent_id)
 where 
     c2.parent_id is null;

Возможно ли вообще такое UPDATE?

1 Ответ

9 голосов
/ 07 января 2012

Вам просто не хватает связывающего предложения WHERE:

UPDATE catalog_category 
SET    leaf_category = TRUE
FROM   catalog_category c1 
LEFT   join catalog_category c2 ON c1.id = c2.parent_id
WHERE  catalog_category.id = c1.id
AND    c2.parent_id IS NULL;

Эта форма с NOT EXISTS, вероятно, быстрее, но делает то же самое:

UPDATE catalog_category 
SET    leaf_category = TRUE
WHERE  NOT EXISTS (
    SELECT *
    FROM   catalog_category c
    WHERE  c.parent_id = catalog_category.id
    );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...