内联查询以更新多行

时间:2009-08-11 10:10:51

标签: sql oracle oracle10g

以下是我在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:单行子查询返回多行

任何输入都会有所帮助。

谢谢!

3 个答案:

答案 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.

此致 罗布。