更新查询比较两个表 - Oracle

时间:2014-07-26 00:28:58

标签: sql oracle oracle11g sql-update

当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'))

2 个答案:

答案 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之后指定。