Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL-从复杂查询更新Oracle 10g数据库_Sql_Oracle - Fatal编程技术网

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,我将很快深入研究这篇文章。非常感谢!