Skip to Main Content
  • Questions
  • Update statement with correlated subquery that intentionally passes multiple rows

Breadcrumb

Question and Answer

Chris Saxon

Thanks for the question, William.

Asked: June 14, 2017 - 9:27 pm UTC

Last updated: June 15, 2017 - 10:02 am UTC

Version: 12c

Viewed 10K+ times! This question is

You Asked

I am trying to update one table using a subquery that totals several transactions from another table. I cannot figure how to link specific rows from my parent table to the rows in my subquery. I keep getting the ORA-01427: Subquery returns more than one row. I was hoping to update several records at a time by joining the update table to the subquery. When I break down each section into select statements, I get the expected results. Below is the script I am using.

update trans a
set activityfeeamt =
    (select sum(transled.totaldolamt * -1)Fee
      from transled,
         (select planid, transid, activityfeeamt from trans where planid = '0003') t
      where transled.planid = t.planid and transled.transid = t.transid 
      and a.transid = t.transid and a.transid = transled.transid
      and transled.transtypecd = 'Di'
      and transled.planid = '0003' 
      group by transled.transid, transled.planid, transled.ssnum, t.activityfeeamt
      having sum(transled.totaldolamt * -1) < t.activityfeeamt)
where a.planid = '0003' 
and a.transid in 
      (select transid
      from trans 
      where planid = '0003' and transid in
      (select transid from transled where planid = '0003' 
      and transtypecd = 'Di' and transid in (176, 179))

and Chris said...

The query that's providing the values for your column must return at most one row for each row in trans.

So you need to find a way to associate each row in the subquery with one row in the table you're updating:

update t1 
set  col = (
  select ...
  from   t2
  where  t1.xyz = t2.abc -- this join must give one row for each row of t1
);


To explain how to fix your query we need to know more about your data. So if you need further help with this we'll need a test case that includes:

- Create table statements for your tables
- Sample data (in the form of inserts) that show the error.

Is this answer out of date? If it is, please let us know via a Comment