【发布时间】:2013-02-27 13:17:44
【问题描述】:
你好,我有 4 张桌子
第一个表是菜单 有专栏:
- 身份证号PK
- parent_id 编号 FK 到 menu.Id
- 标题字符变化(250)
- softdel 布尔默认 false
第二个表格是页面:
- ID 为 PK
- menu_id 作为 menu.id 的 FK
- page_id 作为 page.id 的 FK
- softdel 布尔默认 false
第三个表是文章:
- id 作为 PK 和 FK 到 page.id
- softdel 布尔默认设置为 false
第四张表article_lang:
- partial_id 作为 PK
- id 作为 article.id 的 FK
- 语言字符
- softdel 布尔默认设置为 false
当我“删除”(我的意思是设置 softdel true)菜单时,我需要创建更新语句,例如 200 我还将 softdel = false 设置为 parent_id = 200 的所有菜单以及 menu_id = menus_id 的所有页面和page_id = pages.id 的文章等等....
我只需要 1 个更新语句就可以做到吗??
如果我能创建 JPA 查询或 EJB 查询那就太好了:)
在oracle中我写了语句:
update pub_menu pm set softdel = 0 where pm.id in (
with menu_tree(id, parent_id) as (
select
t1.id , t1.parent_id
from menu t1
where t1.id = 454
union all
select
t2.id , t2.parent_id
from menu_tree
join menu t2 on menu_tree.id = t2.parent_id
)
select id from menu_tree
)
update menu_page pmp set softdel = 1 where pmp.menu_id in (
with menu_tree(id, parent_id) as (
select
t1.id , t1.parent_id
from menu t1
where t1.id = 454
union all
select
t2.id , t2.parent_id
from menu_tree
join menu t2 on menu_tree.id = t2.parent_id
)
select id from menu_tree
)
它的工作,但我这样做是不正确的:/
【问题讨论】:
-
您可以通过在前三个更新中添加
RETURNING some_id并在下一次更新中使用该值来链接四个更新。没有ddl,我就不细说了。 -
使用触发器传播
softdel可能更容易。 -
是的,它在 postgresql 中工作,但我需要在 postgresql 和 oracle 数据库上运行的 sql
-
我认为我什至不会进行更新——检查父行是否将 softdel 设置为 true 可能是有效且高效的
标签: sql oracle postgresql oracle10g postgresql-9.2