Oracle FAQ Your Portal to the Oracle Knowledge Grid
HOME | ASK QUESTION | ADD INFO | SEARCH | E-MAIL US
 

Home -> Community -> Usenet -> c.d.o.misc -> Re: Updating Multiple Columns in Multiple Rows

Re: Updating Multiple Columns in Multiple Rows

From: DA Morgan <damorgan_at_psoug.org>
Date: Wed, 10 Oct 2007 19:43:40 -0700
Message-ID: <1192070607.44610@bubbleator.drizzle.com>


kc wrote:
> /*
> I'm having trouble updating multiple non-nullable columns in multiple
> rows in a single table, using 2 different tables to get the
> correlating data, in a single statement. Tables and 2 of the
> statements I've attempted are below:
>
> I want to update the 77 and 88 rows with the values of 1 and 2,
> linking them
> via the ACC value (AAAA and BBBB) in the T_OLD and T_NEW tables.
>
> The problem is determining which row gets which new value
>
> */
>
> -- Here are the tables
>
> CREATE TABLE TEST (
> ID NUMBER (10) NOT NULL
> );
>
> CREATE TABLE T_OLD (
> ID NUMBER (10) NOT NULL
> ,ACC VARCHAR2(32)
> );
>
> CREATE TABLE T_NEW (
> ID NUMBER (10) NOT NULL
> ,ACC VARCHAR2(32)
> );
>
> INSERT INTO TEST (ID) SELECT 1 FROM dual;
> INSERT INTO TEST (ID) SELECT 2 FROM dual;
> INSERT INTO TEST (ID) SELECT 77 FROM dual;
> INSERT INTO TEST (ID) SELECT 88 FROM dual;
> INSERT INTO TEST (ID) SELECT 9999 FROM dual; --row that shouldn't get
> updated
>
> INSERT INTO T_OLD (ID, ACC) SELECT 1, 'AAAA' FROM dual;
> INSERT INTO T_OLD (ID, ACC) SELECT 2, 'BBBB' FROM dual;
>
> INSERT INTO T_NEW (ID, ACC) SELECT 77, 'AAAA' FROM dual;
> INSERT INTO T_NEW (ID, ACC) SELECT 88, 'BBBB' FROM dual;
> /*
> SELECT * FROM TEST;
> SELECT * FROM T_OLD;
> SELECT * FROM T_NEW;
> */
> -- The Error on the statement below is:
> -- ORA-01427: single-row subquery returns more than one row
>
> UPDATE TEST T1
> SET ( ID ) = (
> SELECT T2.ID
> FROM TEST T2
> JOIN T_OLD ON T2.ID = T_OLD.ID
> JOIN T_NEW ON T_NEW.ACC = T_OLD.ACC
> WHERE T1.ID <> T2.ID
> ) WHERE T1.ID IN (
> SELECT T3.ID
> FROM TEST T3
> JOIN T_NEW ON T3.ID = T_NEW.ID
> JOIN T_OLD ON T_NEW.ACC = T_OLD.ACC
> WHERE T1.ID = T3.ID
> )
>
> -- The error on this attempt is:
> -- ORA-01407: cannot update ("PROSURV_0701"."TEST"."ID") to NULL
> -- Even though I'm specifying records in 1 of the correlating tables,
> it wants
> -- to hit every row and set non-matches to null
> UPDATE TEST T1
> SET ( ID ) = (
> SELECT T_OLD.ID
> FROM TEST T2
> JOIN T_OLD ON T2.ID = T_OLD.ID
> JOIN T_NEW ON T_OLD.ACC = T_NEW.ACC
> LEFT JOIN T_OLD T_OLD_2 ON T_OLD_2.ID = T2.ID
> WHERE
> T2.ID <> T_OLD.ID
> AND T_OLD_2.ID IS NULL
> AND T1.ID = T2.ID
> )
> WHERE T1.ID IN (
> SELECT ID FROM T_OLD
> );

Create a single result set from querying the two tables. Wrap it in parentheses as an inline view. Then use it to update your table.

-- 
Daniel A. Morgan
University of Washington
damorgan_at_x.washington.edu (replace x with u to respond)
Puget Sound Oracle Users Group
www.psoug.org
Received on Wed Oct 10 2007 - 21:43:40 CDT

Original text of this message

HOME | ASK QUESTION | ADD INFO | SEARCH | E-MAIL US