SQL-从复杂查询更新Oracle 10g数据库
尝试根据条件更新单个列。查询返回需要更新的行SQL-从复杂查询更新Oracle 10g数据库,sql,oracle,Sql,Oracle,尝试根据条件更新单个列。查询返回需要更新的行 SELECT it.objectid, it.versionnumber, it.itemnumber "Item Number", it.itemtype, itcovprem.basisofsettlement, itcovprem.coverage "Coverage" FROM itemcoveragesandpremiums itcovprem, items it, policies pl WHERE pl.objectid = i
SELECT
it.objectid,
it.versionnumber,
it.itemnumber "Item Number",
it.itemtype,
itcovprem.basisofsettlement,
itcovprem.coverage "Coverage"
FROM
itemcoveragesandpremiums itcovprem,
items it,
policies pl
WHERE
pl.objectid = it.parentobjectid AND
pl.policytype in ('H','F') AND
it.objectid = itcovprem.itemobjectid AND
it.itemtype in ('SHOA','SHOB','SHOC','SHOD','SHOK','SHOL') and
it.versionnumber = itcovprem.itemversionnumber AND
((itcovprem.coverage like ('A - Dwg Bldg%')) or
(itcovprem.coverage like ('#42 - Repl Cost Plus%')) or
(itcovprem.coverage like ('#42 - Limited GRC%'))) and
it.effectivedate >= TO_DATE('01-JAN-2006', 'DD-MON-YYYY') and
exists (select * from itemcoveragesandpremiums icp where icp.itemobjectid = it.objectid and icp.itemversionnumber = it.versionnumber and icp.coverage like ('#42%')) and
itcovprem.basisofsettlement not in ('LGRC')
我尝试了几个选项将其转换为更新查询,但没有乐趣
使用时,我发现错误-第3行-SQL命令未正确结束
update itemcoveragesandpremiums
set basisofsettlement = 'LGRC'
from itemcoveragesandpremiums as itcovprem
inner join items as it
on it.objectid = itcovprem.itemobjectid and it.versionnumber = itcovprem.itemversionnumber
inner join policies as pl
on pl.objectid = it.parentobjectid
where [cut, rest of query was below]
在尝试使用内联查询时,出现错误-第6行-缺少右括号
update
(
SELECT
itcovprem.basisofsettlement as OLD
FROM
itemcoveragesandpremiums as itcovprem inner join items as it on it.objectid = itcovprem.itemobjectid and it.versionnumber = itcovprem.itemversionnumber inner join policies AS pl on pl.objectid = it.parentobjectid
WHERE [query snipped]
) t
set t.old = 'LGRC'
似乎SQL*Plus只是想在更新进入我的select查询之前停止查看它。我不确定是格式错误还是方向错误。有什么建议吗?在第一次尝试中,第3行的错误是因为
update
不支持from
或join
子句。在第二次尝试中,第6行的直接错误是因为您试图将的表别名为itcovprem
;但是(第一次尝试也是这么做,但还没有到遇到问题的程度)。但是您通常无法使用连接更新内联视图,因此它仍然会出错—类似于ORA-01779
您需要执行以下操作:
update itemcoveragesandpremiums
set basisofsettlement = 'LGRC'
where (itemobjectid, itemversionnumber, basisofsettlement, coverage) in (
select it.objectid,
it.versionnumber,
itcovprem.basisofsettlement,
itcovprem.coverage
from ...
)
假设itemobjectid、itemversionnumber、basisofsettlement、coverage
充分标识了一行,这样您就不会冒险更新任何不应该更新的内容。将rowid
添加到“选择并使用它进行更新”中可能更安全,以避免歧义:
update itemcoveragesandpremiums
set basisofsettlement = 'LGRC'
where rowid in (
select itcovprem.rowid as target_rowid
from ...
)
除非自我的“Oracle时代”以来发生了一些变化,否则Oracle不支持JOIN in UPDATE语句。最后一个原因是您不能使用
as
来别名表名;它仅对别名列名有效。在这里,解析器将视为
别名,然后不知道如何处理itcovprem
。但是带有连接的内联视图无论如何都不可能是可更新的。您可能想查看这篇旧文章,看看是否有任何方法适合您。谢谢Alex,我将很快深入研究这篇文章。非常感谢!