以下是我在Oracle 10g中使用的表的简要说明:
注意: 表:jnldetail:单行,数据如图所示。 对于帐户,有多个包ID附加到同一bill_ref_no。因此,我正在尝试使用多个package_id更新“jnldetail”。
index_bill_ref和bill_ref_no之间的关系:1 - 1 account_no和(index_bill_ref和bill_ref_no)之间的关系:1 - 很多
**Table : jnldetail** :
account_no bill_ref_no amount
8594822 74282843 822
我正在使用以下命令添加另一个列package_id:
alter table jnldetail add package_id number(10)
**table: bill_invoice**:
account_no bill_ref_no index_bill_ref
8594822 74282843 763653495
**table: bill_invoice_detail**:
index_bill_ref package_id component_id
763653495 20000077 20000177
763653495 20000250 20000528
763653495 13000019 13000137
**Expected Result:**
**Table : jnldetail** :
account_no bill_ref_no amount package_id
8594822 74282843 822 20000077
8594822 74282843 822 20000250
8594822 74282843 822 13000019
我的查询是:
UPDATE jnldetail tp
SET tp.package_id = (
select
t1.package_id
from bill_invoice_detail t1
, bill_invoice t2
where
t1.index_bill_ref = t2.index_bill_ref
and
t2.account_no = tp.account_no
)
错误消息为:ora 01427:单行子查询返回多行
任何输入都会有所帮助。
谢谢!
答案 0 :(得分:1)
问题在于您尝试将tp.package_id设置为多个数字,因为您的子查询返回了多个结果,例如20000077和13000019.您需要更改子查询,以便只返回一个值。
答案 1 :(得分:0)
为什么不准备获取完整数据时保持表格分开并使用连接?
答案 2 :(得分:0)
这有点棘手,原因有两个:
1)您想要更新现有行,并希望添加两个新行
2)两个新行需要来自原始jnldetail表(金额)和bill_invoice表(package_id)的数据
要解决1,可以使用MERGE语句,但由于2,MERGE语句的using子句中需要jnldetail。
以下是您的示例:
SQL> create table jnldetail (account_no, bill_ref_no, amount)
2 as
3 select 8594822, 74282843, 822 from dual
4 /
Tabel is aangemaakt.
SQL> alter table jnldetail add package_id number(10)
2 /
Tabel is gewijzigd.
SQL> create table bill_invoice (account_no, bill_ref_no, index_bill_ref)
2 as
3 select 8594822, 74282843, 763653495 from dual
4 /
Tabel is aangemaakt.
SQL> create table bill_invoice_detail (index_bill_ref, package_id, component_id)
2 as
3 select 763653495, 20000077, 20000177 from dual union all
4 select 763653495, 20000250, 20000528 from dual union all
5 select 763653495, 13000019, 13000137 from dual
6 /
Tabel is aangemaakt.
你描述的表格。
SQL> UPDATE jnldetail tp
2 SET tp.package_id =
3 ( select t1.package_id
4 from bill_invoice_detail t1
5 , bill_invoice t2
6 where t1.index_bill_ref = t2.index_bill_ref
7 and t2.account_no = tp.account_no
8 )
9 /
( select t1.package_id
*
FOUT in regel 3:
.ORA-01427: single-row subquery returns more than one row
您的更新语句失败,因为您尝试将3行返回查询的结果分配给单个列。
以下是MERGE声明:
SQL> merge into jnldetail jd
2 using ( select bi.account_no
3 , bi.bill_ref_no
4 , jd.amount
5 , bid.package_id
6 , row_number() over (partition by bi.account_no,bi.bill_ref_no,bi.index_bill_ref order by null) rn
7 from bill_invoice bi
8 , bill_invoice_detail bid
9 , jnldetail jd
10 where bi.index_bill_ref = bid.index_bill_ref
11 and bi.account_no = jd.account_no
12 and bi.bill_ref_no = jd.bill_ref_no
13 ) bi
14 on ( jd.account_no = bi.account_no
15 and jd.bill_ref_no = bi.bill_ref_no
16 and bi.rn = 1
17 )
18 when matched then
19 update set package_id = package_id
20 when not matched then
21 insert values (bi.account_no,bi.bill_ref_no,bi.amount,bi.package_id)
22 /
3 rijen zijn samengevoegd.
请注意,我们选择要更新的任意行:rn = 1的行。 它导致了所需的结果集:
SQL> select * from jnldetail
2 /
ACCOUNT_NO BILL_REF_NO AMOUNT PACKAGE_ID
---------- ----------- ---------- ----------
8594822 74282843 822 13000019
8594822 74282843 822 20000077
8594822 74282843 822 20000250
3 rijen zijn geselecteerd.
此致 罗布。