【问题标题】:Updating child rows based on parent values with Oracle sql使用 Oracle sql 根据父值更新子行
【发布时间】:2014-12-19 00:46:09
【问题描述】:

我在 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 更新 sql 来不仅用航班更新相应的父行并将标志更改为 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 );

这行得通!

【问题讨论】:

  • 在此处发布“easy”部分。
  • 您不能使用单个 UPDATE 语句更新多个表。
  • 我不打算更新多个表。只有族表需要更新,但更新必须与父行一起级联到子行。我怎样才能修改这个sql来做一个级联:UPDATE family fm SET (fm.flight, flag) = (SELECT fl.flight, "Y" FROM flight fl WHERE fl.family_id = fm.id) WHERE EXISTS (SELECT 1 FROM flight fl WHERE fl.family_id = fm.id and fm.flag "Y" and fm.flight IS NULL)
  • 尝试在线搜索connect by prior,您应该有答案。

标签: sql oracle parent-child hierarchy


【解决方案1】:

是的,你可以。在 oracle 中,递归选择很容易。这是我的建议:

Update family set flag='Y' 
    where id in(select id from family start with id=3 
                     connect by prior id=parent_id)

【讨论】:

  • 但是我如何为所有家庭而不是特定家庭做这件事,即我如何开始为所有家庭工作?
猜你喜欢
  • 2022-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-18
  • 2010-11-26
相关资源
最近更新 更多