我的表calendar
包含整数字段calendarid
,parentid
,projectid
。
通过填写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
可能与父项目不同,因此不能选择覆盖所有子项值。
答案 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)
)