当前位置:  开发笔记 > 数据库 > 正文

Oracle Insert via从多个表中选择,其中一个表可能没有行

如何解决《OracleInsertvia从多个表中选择,其中一个表可能没有行》经验,为你挑选了2个好方法。

我有许多代码值表,包含代码和具有Long id的描述.

我现在想要为一个引用了许多代码的帐户类型创建一个条目,所以我有这样的东西:

insert into account_type_standard (account_type_Standard_id,
tax_status_id, recipient_id)
( select account_type_standard_seq.nextval,
ts.tax_status_id, r.recipient_id
from tax_status ts, recipient r
where ts.tax_status_code = ?
and r.recipient_code = ?)

如果找到相应代码的匹配项,则会从tax_status和recipient表中检索适当的值.不幸的是,recipient_code是可以为空的,因此?替换值可以为null.当然,隐式连接不会返回一行,因此一行不会插入到我的表中.

我试过用NVL吗?并在r.recipient_id上.

我试图在r.recipient_code =上强制外连接?通过添加(+),但它不是显式连接,因此Oracle仍然没有添加另一行.

有人知道这样做的方法吗?

我可以明显地修改语句,以便我在外部查找recipient_id,并有一个?而不是r.recipient_id,并且根本不从收件人表中进行选择,但我更愿意在1个SQL语句中完成所有这些操作.



1> Greg Ogle..:

在这种情况下,Outter联接不能"按预期"工作,因为您已明确告诉Oracle,如果该表上的条件匹配,您只需要数据.在那种情况下,外部联接变得无用.

解决方法

INSERT INTO account_type_standard 
  (account_type_Standard_id, tax_status_id, recipient_id) 
VALUES( 
  (SELECT account_type_standard_seq.nextval FROM DUAL),
  (SELECT tax_status_id FROM tax_status WHERE tax_status_code = ?), 
  (SELECT recipient_id FROM recipient WHERE recipient_code = ?)
)

[编辑]如果您希望子选择中有多行,则可以为每个where子句添加ROWNUM = 1或使用MAX或MIN等聚合.对于所有情况,这当然可能不是最佳解决方案.

[编辑]每条评论,

  (SELECT account_type_standard_seq.nextval FROM DUAL),

可以就是

  account_type_standard_seq.nextval,



2> Tony Andrews..:

Oglester解决方案的略微简化版本(序列不需要从DUAL中选择:

INSERT INTO account_type_standard   
  (account_type_Standard_id, tax_status_id, recipient_id) 
VALUES(   
  account_type_standard_seq.nextval,
  (SELECT tax_status_id FROM tax_status WHERE tax_status_code = ?),
  (SELECT recipient_id FROM recipient WHERE recipient_code = ?)
)

推荐阅读
LEEstarmmmmm
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有