我在Oracle中有2个表,其结构类似于:
家庭表
id member parent_id flag flight
---------------------------------
1 A null N null
2 B 1 N null
3 C null N null
4 D 3 N null
5 E 3 N null
6 F null N null
7 G 6 N null
航班表
id family_id flight
-----------------------
1 1 1000
2 3 2000
这里家庭表中id为4,5的行是第3行的子节点,第2行是1的子节点。
现在,我需要编写一个oracle update sql,不仅要更新带有flight的相应父行,还要将标志更改为Y,但也应该相应地更新子行。如果在飞行表中没有相应的航班分配,那么第6,7行应保持原样。
进行父更新并轻松查找父级的子级。但是有可能在一个sql中进行所有更新吗?
感谢。
更新
update family fm set (flag, flight) =
(
select 'Y', fl.flight from flight fl where fm.flag <> 'Y' and
(
(fl.parent_id=fm.id and fm.parent_id is null )
or fm.parent_id=fl.parent_id
)
)
where exists (select 1 from flight fl where fm.id=fl.parent_id or fl.parent_id=fm.parent_id );
这有效!!
答案 0 :(得分:0)
是的,你可以。在oracle中,很容易递归选择。这是我的建议:
Update family set flag='Y'
where id in(select id from family start with id=3
connect by prior id=parent_id)