| Oracle FAQ | Your Portal to the Oracle Knowledge Grid | |
Home -> Community -> Usenet -> c.d.o.misc -> Suggestions on a good way to write an Update with a join
Hi,
Is there a way to write an update statement that affects several columns of a table, based on a join to another table, without using zillions of subqueries? This is easy in Sybase, but the syntax of Oracle seems to be stopping me.
For example, consider this table:
CREATE TABLE fu
(PKFu1 integer
,PKFu2 integer
,PKRevision integer
,FuCol4 integer
,FuCol5 integer
,FuCol6 integer
,FuCol7 integer
);
Let's say I want to copy all rows whose PKRevision column is 5 to the corresponding rows with PKRevision equal to 0. In Sybase, I could write the query this way:
UPDATE Fu
SET FuCol4 = f2.FuCol4
, FuCol5 = f2.FuCol5
, FuCol6 = f2.FuCol6
WHERE Fu.PKFu1 = f2.PKFu1
AND Fu.PKFu2 = f2.PKFu2
AND f2.PKRevision = 5
AND f2.PKRevision = 0
However, since Oracle doesn't like the FROM in the body of the update, I'm forced to write the update this way:
UPDATE Fu
SET FuCol4 =
( SELECT FuCol4
FROM Fu f2
WHERE Fu.PKFu1 = f2.PKFu1
AND Fu.PKFu2 = f2.PKFu2
AND f2.PKRevision = 5
)
, FuCol5 =
( SELECT FuCol5
FROM Fu f2
WHERE Fu.PKFu1 = f2.PKFu1
AND Fu.PKFu2 = f2.PKFu2
AND f2.PKRevision = 5
)
, FuCol6 =
( SELECT FuCol6
FROM Fu f2
WHERE Fu.PKFu1 = f2.PKFu1
AND Fu.PKFu2 = f2.PKFu2
AND f2.PKRevision = 5
)
WHERE PKRevision = 0
AND EXISTS
( SELECT 1
FROM Fu f2
WHERE Fu.PKFu1 = f2.PKFu1
AND Fu.PKFu2 = f2.PKFu2
AND f2.PKRevision = 5
)
I need the EXISTS in the WHERE clause to prevent any rows without a corresponding PKRevision = 5 from being set to 0.
I tried using this construction:
UPDATE (
SELECT fu.FuCol4
, f2.FuCol4 new_FuCol4
, fu.FuCol5
, f2.FuCol5 new_FuCol5
, fu.FuCol6
, f2.FuCol6 new_FuCol6
FROM Fu, Fu f2
WHERE Fu.PKFu1 = f2.PKFu1
AND Fu.PKFu2 = f2.PKFu2
AND f2.PKRevision = 5
AND f2.PKRevision = 0
)
SET FuCol4 = new_FuCol4
, FuCol5 = new_FuCol5
, FuCol6 = new_FuCol6
But I get this error:
ORA-01779: cannot modify a column which maps to a non key-preserved table
It seems to me that I must have overlooked something, since in general Oracle has more features than Sybase. Is there a better way?
If you can, please respond to
sbroburg_at_concord.tt.slb.com, (but spell the
first part as sbroberg) since my connection here
slow.
--== Sent via Deja.com http://www.deja.com/ ==-- ---Share what you know. Learn what you don't.--- Received on Tue May 18 1999 - 16:34:09 CDT
![]() |
![]() |