Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 使用select子查询将列更新到同一表_Mysql_Sql_Sql Update - Fatal编程技术网

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

Mysql 使用select子查询将列更新到同一表,mysql,sql,sql-update,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_

下表示例。我最近添加了“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

基本上,我想选择IDS3、5和6,并将列is_last_child设置为1。这不是我的模式,有数千行,但上面的表只是为了简化事情。

使用另一个子查询,因为您不能同时更新正在选择的表(在MySQL中)。但是通过建立一个临时表,它可以工作

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

使用另一个子查询,因为不能同时更新正在选择的表(在MySQL中)。但是通过建立一个临时表,它可以工作

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

您想从以下位置更新

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
相同,只是它更易于阅读,并且不需要大量嵌套查询。

您想要
从中更新:

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
相同,只是它更易于阅读,并且不需要大量嵌套查询。

虽然您无法更新正在选择的表,但我认为您可以更新联接到自身的表:

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
;

虽然您无法更新正在选择的表,但我认为您可以更新与其自身连接的表:

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
;

谢谢你的帮助。你的解决方案奏效了,但我读到如果可以避免的话,不建议这样做。谢谢你的帮助。你的解决方案奏效了,但我听说如果可以避免的话就不推荐了,谢谢!这起作用了。因为我使用mysql,所以我不得不修改语法,但我最终还是成功了。谢谢!这起作用了。因为我使用的是mysql,所以我不得不修改语法,但我最终还是成功了。