2016-05-17 3 views
0

Пример таблицы ниже. Недавно я добавил столбец «is_last_child» и хочу обновить его, чтобы иметь значение 1, если строка является последним дочерним элементом (или не является родителем). У меня был запросОбновление столбца с помощью подзапроса select в той же таблице

update node set is_last_child=1 where id not in (select parent_id from node); 

При запуске я получаю следующее сообщение об ошибке. «Вы не можете указать узел« целевой таблицы »для обновления в предложении FROM». Я пробовал использовать соединение, но я уверен, как именно я могу обновить только строки, которые не являются родителями. У кого-нибудь есть идеи или они сталкиваются с подобной ситуацией?

id | parent_id | is_last_child 
1 | 1  |  0 
2 | 1  |  0 
3 | 1  |  0 
4 | 2  |  0 
5 | 4  |  0 
6 | 1  |  0 

По существу я хочу, чтобы выбрать идентификаторы 3, 5, и 6, и установите столбец is_last_child равным 1. Это не моя схема и есть тысячи строк, но приведенная выше таблица является только упростить вещи ,

ответ

0

Вы хотите UPDATE FROM:

UPDATE N1 
SET N1.is_last_child = 1 
FROM Node N1 
LEFT OUTER JOIN Node N2 
    ON N1.ID = N2.Parent_ID 
WHERE N2.ID IS NULL 

Левое внешнее соединение концептуально так же, как с помощью NOT IN только это легче читать и вам не нужно кучу вложенных запросов.

+0

Спасибо! это сработало. Я просто должен был изменить синтаксис, так как я использую mysql, но я получил его работу в конце. –

0

Используйте другой подзапрос, так как вы не можете обновлять таблицу, которую вы выбираете одновременно (в MySQL). Но путем создания временной таблицы она работает

update node 
set is_last_child=1 
where id not in 
(
    select * from 
    (
    select parent_id from node 
) tmp 
); 
+0

Спасибо за вашу помощь. Ваше решение сработало, но я читал, что не рекомендуется, если его можно избежать –

0

Хотя вы не можете обновить таблицу, вы выбираете из, я думаю, вы можете обновить таблицу присоединилась к себе:

UPDATE `node` AS n1 LEFT JOIN `node` AS n2 ON n1.id = n2.parent_id 
SET n1.is_last_child = 1 
WHERE n2.id IS NULL 
; 
Смежные вопросы