使用select子查询将列更新到同一个表

时间:2016-05-17 19:29:44

标签: mysql sql sql-update

下面的示例表。我最近添加了列'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.这不是我的架构,有数千行,但上面的表只是为了简化。

3 个答案:

答案 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
;