gpt4 book ai didi

sql - Oracle Insert 通过从多个表中选择,其中一个表可能没有一行

转载 作者:行者123 更新时间:2023-12-04 00:04:58 33 4
gpt4 key购买 nike

我有许多代码值表,其中包含一个代码和一个带有 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_code 可以为空,因此 ?替换值可以为空。当然,隐式连接不会返回一行,因此不会将一行插入到我的表中。

我试过在 ?并在 r.recipient_id 上。

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

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

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

最佳答案

在这种情况下,外部联接不会“按预期”工作,因为您已经明确告诉 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,

关于sql - Oracle Insert 通过从多个表中选择,其中一个表可能没有一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/131164/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com