首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >比较两个表的更新查询- Oracle

比较两个表的更新查询- Oracle
EN

Stack Overflow用户
提问于 2014-07-26 00:28:58
回答 2查看 952关注 0票数 0

当account_type表中的aif_hyp_acct_type字段为“”、“R”、“L”、“Q”时,我试图更改tdataseg表中的数量字段的符号。aif_hyp_acct_type是主表。它有讨厌的、account和account_type字段。tdataseg表有帐户、金额和许多其他字段。

我尝试了这个查询,得到了或01427错误。

单行子查询返回多行。

代码语言:javascript
复制
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'))
EN

回答 2

Stack Overflow用户

发布于 2014-07-26 00:53:28

问题大概是你认为你有一个相关的子查询,但你没有。外部表在内部查询中被提到。您需要删除该引用:

代码语言:javascript
复制
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,您将得到该错误。这里有一个解决办法:

代码语言:javascript
复制
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

票数 0
EN

Stack Overflow用户

发布于 2014-07-26 07:11:41

我会尝试用MERGE语句来解决这样的更新问题。我觉得写作更自然一些。

代码语言:javascript
复制
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之后指定实际的数据更改。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24966335

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档