如何更新子记录中的缺失值?

时间:2014-08-25 14:03:05

标签: sql

我的表calendar包含整数字段calendaridparentidprojectid
通过填写parentid指向父记录的calendarid键字段来定义子记录。

需要在更新查询中修复的错误情况:

如果父记录中填写了projectid而儿童没有填写:将projectid从父级复制到子级。

这只是一个深度,孩子的数量是[0..n]

为了让所有失踪的孩子projectid,我有这个,
但我正在努力将其构建到正确的更新查询中:

select * from calendar o
where (coalesce(o.projectid,0)=0) and (coalesce(o.parentid,0)<>0)
and exists(select calendar_id from calendar i
           where (i.calendar_id=o.parentid)
           and (coalesce(i.projectid,0) <> 0)
          )

更新查询是什么(在vanilla SQL中,因为它必须在Firebird,SQL Server和Oracle的多个版本上运行)?。

(请注意,在当前情况下,子记录的projectid可能与父项目不同,因此不能选择覆盖所有子项值。

2 个答案:

答案 0 :(得分:1)

这些更新的数据库之间存在很多语法差异。

update
    calendar
set
    projectid = (select projectid from calendar c where calendar.parentid = c.calendarid)
where
    projectid is null;

符合标准,适用于大多数地方。

这是假设&#34;没有填写&#34;意味着无效。

答案 1 :(得分:0)

看起来您可以使用已有的查询并将其加入父级。

您可以将其更改为更新,如下所示:

UPDATE o
Set o.ProjectId = p.ProjectId
from calendar o join calendar p on p.calendarId = o.ParentId
where (coalesce(o.projectid,0)=0) and (coalesce(o.parentid,0)<>0)
and exists(select calendar_id from calendar i
           where (i.calendar_id=o.parentid)
           and (coalesce(i.projectid,0) <> 0)
          )