一尘不染

通过从多个表中选择进行Oracle插入,其中一个表可能没有行

sql

我有许多代码值表,其中包含一个代码和一个带有长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和收件人表中检索适当的值。不幸的是,receiver_code是可为空的,因此?替换值可以为null。当然,隐式联接不会返回任何行,因此不会将行插入到我的表中。

我尝试在上使用NVL?并在r.recipient_id上。

我试图在r.recipient_code =上强制进行外部联接。通过添加(+),但它不是显式联接,因此Oracle仍未添加另一行。

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

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


阅读 132

收藏
2021-03-17

共1个答案

一尘不染

在这种情况下,外部联接无法“按预期的方式工作”,因为您已明确告知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 = ?)
)

[编辑]如果希望子选择有多行,则可以将ROWNUM =
1添加到每个where子句中,或使用汇总(例如MAX或MIN)。当然,这可能不是所有情况下的最佳解决方案。

[编辑]每条评论,

  (SELECT account_type_standard_seq.nextval FROM DUAL),

可以只是

  account_type_standard_seq.nextval,
2021-03-17