使用Oracle sql根据父值更新子行

时间:2014-12-19 00:46:10

标签: sql oracle parent-child hierarchy

我在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 );

这有效!!

1 个答案:

答案 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)