【问题标题】:update table based on subquery of table根据表的子查询更新表
【发布时间】:2011-09-19 21:12:29
【问题描述】:

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

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 页的记录,目标是:

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

用一个(无效的)子查询来描述这个,像这样:

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 甜蜜更重要...

【问题讨论】:

标签: mysql transitive-closure-table


【解决方案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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-02
    • 2013-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多