下面的示例表。我最近添加了列'is_last_child',并且如果该行是最后一个子节点(或者不是父节点),则希望将其更新为值1。我有一个查询
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
基本上我想选择id 3,5和6,并将列is_last_child设置为1.这不是我的架构,有数千行,但上面的表只是为了简化。
答案 0 :(得分:0)
使用另一个子查询,因为您无法同时更新您正在选择的表(在MySQL中)。但通过构建临时表,它可以工作
update node
set is_last_child=1
where id not in
(
select * from
(
select parent_id from node
) tmp
);
答案 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
相同,只是它更容易阅读,并且您不需要一堆嵌套查询。
答案 2 :(得分: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
;