Oracle FAQ | Your Portal to the Oracle Knowledge Grid |
![]() |
![]() |
Home -> Community -> Usenet -> c.d.o.server -> Re: What is the difference between this two SQL?
On Dec 5, 10:33 am, emdproduct..._at_hotmail.com wrote:
> Group,
>
> I would like to update table test from test1. But I do not understand
> why we need to use where exists subquery
>
> SQL> select * from test;
>
> ID COL1
> ---------- ----------
> 1 a1
> 2 b1
> 3 c1
> 4 d1
>
> SQL> select * from test2;
>
> ID COL1
> ---------- ----------
> 1 a2
> 2 b2
> 3 c2
> 4
>
> Both two update statement seems to be working;
> SQL> update test
> 2 set col1 = (select col1 from test2
> 3 where test.id=test2.id);
>
> 4 rows updated.
>
> SQL> select * from test;
>
> ID COL1
> ---------- ----------
> 1 a2
> 2 b2
> 3 c2
> 4
>
> SQL> rollback;
>
> Rollback complete.
>
> SQL> select * from test;
>
> ID COL1
> ---------- ----------
> 1 a1
> 2 b1
> 3 c1
> 4 d1
>
> SQL> update test
> 2 set col1 = (select col1 from test2
> 3 where test.id=test2.id)
> 4 where exists
> 5 (select 1 from test2 where test.id=test2.id);
>
> 4 rows updated.
>
> SQL> select * from test;
>
> ID COL1
> ---------- ----------
> 1 a2
> 2 b2
> 3 c2
> 4
>
> Is it necessary to use the exists where clause?
>
> Thanks for your help.
You will see a difference if ID 4 does not exist in table TEST2. For
example:
CREATE TABLE T1 (
C1 NUMBER(8),
C2 NUMBER(8));
CREATE TABLE T2 (
C1 NUMBER(8),
C2 NUMBER(8));
INSERT INTO T1 VALUES (1,1); INSERT INTO T1 VALUES (2,2); INSERT INTO T1 VALUES (3,3); INSERT INTO T1 VALUES (4,4); INSERT INTO T1 VALUES (5,5); INSERT INTO T2 VALUES (1,0); INSERT INTO T2 VALUES (2,0);
COMMIT;
Now, an update without limiting the rows that will be affected:
UPDATE
T1
SET
C2=(
SELECT
C2
FROM
T2
WHERE
T1.C1=T2.C1);
5 rows updated.
SELECT
*
FROM
T1;
C1 C2
---------- ----------
1 0 2 0 3 0 4 0 5
Note the null value that is now present in T1.C2 where C1 is 5. Since there was no matching row in table T2, the value was set to NULL.
ROLLBACK;
Now again, this time constraining the rows to be updated:
UPDATE
T1
SET
C2=(
SELECT
C2
FROM
T2
WHERE
T1.C1=T2.C1)
WHERE
T1.C1 IN (
SELECT
C1
FROM
T2);
4 rows updated.
SELECT
*
FROM
T1;
C1 C2
---------- ----------
1 0 2 0 3 0 4 0 5 5
Note that the last row, where C1=5 does not have C2 set to NULL.
ROLLBACK;
The same query using the EXISTS clause:
UPDATE
T1
SET
C2=(
SELECT
C2
FROM
T2
WHERE
T1.C1=T2.C1)
WHERE
EXISTS (
SELECT
1
FROM
T2
WHERE
T1.C1=T2.C1);
4 rows updated.
SELECT
*
FROM
T1;
C1 C2
---------- ----------
1 0 2 0 3 0 4 0 5 5
Charles Hooper
IT Manager/Oracle DBA
K&M Machine-Fabricating, Inc.
Received on Wed Dec 05 2007 - 10:07:19 CST
![]() |
![]() |