当aif_hyp_acct_type表中的account_type为'时,我正在尝试更改tdataseg表中amount字段的符号。 '' R'' L'' Q&#39 ;. aif_hyp_acct_type是主表。它有loadid,account和account_type字段。 tdataseg表有帐户,金额和许多其他字段。
我尝试了此查询并收到 ORA-01427 错误。
单行子查询返回多行。
update tdataseg
set tdataseg.amount =
(select decode(sign(tdataseg.amount),-1,abs(tdataseg.amount),1,-abs(tdataseg.amount),0)
from tdataseg, aif_hyp_acct_type
where tdataseg.loadid = aif_hyp_acct_type.loadid
and tdataseg.account = aif_hyp_acct_type.account
and aif_hyp_acct_type.account_type in (' ','R','L','Q'))
答案 0 :(得分:0)
据推测,问题是你认为你有一个相关的子查询,但你不是。外部表在内部查询中提到。您需要删除该引用:
update tdataseg
set tdataseg.amount = (select decode(sign(tdataseg.amount), -1, abs(tdataseg.amount),
1,-abs(tdataseg.amount), 0)
from aif_hyp_acct_type
where tdataseg.loadid = aif_hyp_acct_type.loadid and
tdataseg.account = aif_hyp_acct_type.account and
aif_hyp_acct_type.account_type in (' ','R','L','Q')
);
编辑:
如果没有匹配且列声明为not null
,您将收到该错误。这是一个修复:
update tdataseg
set tdataseg.amount = (select coalesce(max(decode(sign(tdataseg.amount), -1, abs(tdataseg.amount),
1,-abs(tdataseg.amount), 0)), 0)
from aif_hyp_acct_type
where tdataseg.loadid = aif_hyp_acct_type.loadid and
tdataseg.account = aif_hyp_acct_type.account and
aif_hyp_acct_type.account_type in (' ','R','L','Q')
);
这会将不匹配设置为0
。
答案 1 :(得分:0)
我尝试使用MERGE
语句解决此类更新问题。我觉得写作更自然。
MERGE INTO tdataseg
USING (
SELECT loadid, account
FROM aif_hyp_acct_type
WHERE account_type IN (' ','R','L','Q')
) q
ON (tdataseg.loadid=q.loadid AND tdataseg.account=q.account)
WHEN MATCHED THEN UPDATE SET amount = - ABS(amount);
您在MERGE INTO
之后放置了要更改的表格。主表在USING
查询中进行了子集化。连接条件进入ON
子句,实际数据更改在WHEN MATCHED THEN UPDATE SET
之后指定。