基于表的子查询更新表

时间:2011-09-19 13:03:09

标签: mysql transitive-closure-table

我正在使用某个页面层次结构的闭包表。我希望能够删除一个页面并更新它离开的孩子的级别。

par child level
1   1     0
1   2     1
2   2     0
1   3     2
2   3     1
3   3     0
1   4     3
2   4     2
3   4     1
4   4     0

在删除第3页之前,我尝试更新级别,然后删除第3页的reocrds,这样做的目标是:

par child level
1   1     0
1   2     1
2   2     0
1   4     2
2   4     1
4   4     0

用这样的(无效)suquery来描述这个:

UPDATE tbl_page_structures
SET page_level = page_level - 1 
WHERE
    child IN ( SELECT child FROM tbl_page_structures WHERE par = 3 )
AND page_level != 0;
DELETE ... where par=3 or child=3;

显然在更新时失败。

理想情况下,想要在一个查询中完成,但如果tmp能够继续下去那么就这样了 - 对此表现更为重要的是甜蜜的sql甜蜜......

1 个答案:

答案 0 :(得分:1)

尝试:

UPDATE tbl_page_structures
SET page_level = page_level - 1 
WHERE
    child IN (SELECT * FROM( SELECT child FROM tbl_page_structures WHERE par = 3 ))
AND page_level != 0;
DELETE ... where par=3 or child=3;

正如@Mark所说:

  

目前,您无法更新表并从子查询中的同一表中进行选择。

来源:http://dev.mysql.com/doc/refman/5.5/en/update.html

但是如果你在子子查询中进行内部选择,你可以。