我有许多代码值表,包含代码和具有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语句中完成所有这些操作.
在这种情况下,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,
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 = ?) )