Thank you so much Richard, I got an isea from you people to solve this
issue.

On Wed, Sep 1, 2010 at 2:28 PM, Richard Pascual <richg...@gmail.com> wrote:

> Hi Swaroop,
>
> Thanks for the feedback. My intention was not to solve your problem
> entirely but to illustrate a concept that might get you closer to a solution
> and to provide a piece of Oracle knowledge that would be of interest to the
> mailing list community in general.
>
> A join view *will* work with tables with different keys... even composite
> keys. As I mentioned in my solution, you just need to make sure that the
> keys involved are identified as primary key constraints.
>
> Rich Pascual
> Database Programmer
> IT Systems Management
> U.C. Berkeley
>
>   On Wed, Sep 1, 2010 at 11:31 AM, swaroop gowda 
> <swaroop.t...@gmail.com>wrote:
>
>>   I agree with you.
>> Thank you Andrew.
>>
>>   On Wed, Sep 1, 2010 at 1:27 PM, Trail <andrew.tr...@gnb.ca> wrote:
>>
>>> If you want to limit the rows updated on a large table, I guess I
>>> would look at one of a couple options then ...
>>>
>>> 1)  UPDATE TABLE_A A
>>> SET A.COL1 = NVL((SELECT B.COL1 FROM TABLE B WHERE A.COL_PK =
>>> B.COL_PK),A.COL1),
>>> A.COL2 = NVL((SELECT C.COL2 FROM TABLE C WHERE A.COL_PK =
>>> C.COL_PK),A.COL2)
>>> where exists (SELECT 'Found B table record' FROM TABLE B WHERE
>>> A.COL_PK = B.COL_PK)
>>>  or  exists (SELECT 'Found C table record' FROM TABLE C WHERE
>>> A.COL_PK = C.COL_PK)
>>>
>>> Downside - it will update col1 when only col2 is found and vice
>>> versa.  The data will not change in those cases, but this might not be
>>> exactly what you are looking for either...
>>>
>>> 2)  Performance (if you are looking at really large tables, with many
>>> updates) - this is quite a bit different...
>>>
>>> (obviously, include any other columns that exist.)
>>>
>>> create table new_table as (select NVL((SELECT B.COL1 FROM TABLE B
>>> WHERE A.COL_PK = B.COL_PK),A.COL1)
>>>                                 ,NVL((SELECT C.COL2 FROM TABLE C
>>> WHERE A.COL_PK = C.COL_PK),A.COL2)
>>>                             from table_a A)
>>>
>>> drop old table
>>>
>>> rename new_table to old table.
>>>
>>> Anyway, just thought I'd throw the ideas out there.
>>>
>>> -A.
>>>
>>>
>>> On Sep 1, 3:06 pm, swaroop gowda <swaroop.t...@gmail.com> wrote:
>>> > But it is going to update the table I don't want to do that.
>>> > Later on performance may be the issue. I am playing with more than
>>> 10million
>>> > worth of data.
>>> >
>>> >
>>> >
>>> >
>>> >
>>>  > On Wed, Sep 1, 2010 at 12:56 PM, Trail <andrew.tr...@gnb.ca> wrote:
>>> > > Hi folks,
>>> >
>>> > > I actually read this question differently, just looking at:
>>> >
>>> > > "Basically it should update when there is a match else if the
>>> > > subquery
>>> > > returns no data should not update anything. Please let me know how
>>> can
>>> > > I do "
>>> >
>>> > > I am likely oversimplifying, but I would simply use and NVL statement
>>> > > to update the column to itself (no change) when the subquery returns
>>> > > NULL.  The drawback here, is that every row will be updated.
>>> > > Depending on the table, rollback or locking might be an issue (if it
>>> > > is a problem, using an exists clause for the same subqueries might be
>>> > > an idea).
>>> >
>>> > > For what it's worth, here's the syntax.
>>> >
>>> > >  UPDATE TABLE_A A
>>> > > SET A.COL1 = NVL((SELECT B.COL1 FROM TABLE B WHERE A.COL_PK =
>>> > > B.COL_PK),A.COL1);
>>> >
>>> > > -Andrew.
>>> >
>>> > > On Sep 1, 2:42 pm, Richard Pascual <richg...@gmail.com> wrote:
>>> > > > Hi Swaroop,
>>> >
>>> > > > Using your example table structures, here's how I figured out how
>>> to
>>> > > > generate a working update statement:
>>> >
>>> > > > The key is that you need to make sure that your col_pk (I am
>>> assuming it
>>> > > is
>>> > > > a primary key column) is also declared as a primary key constraint.
>>> >
>>> > > > The limitation of this solution (using a "join view") is that you
>>> > > *cannot*
>>> > > > update references to columns from "table_b" and "table_c" but the
>>> update
>>> > > > statement will let you change columns from "table_a"... which looks
>>> ok
>>> > > > anyways from the nature of your request.
>>> >
>>> > > > - Rich
>>> >
>>> > > > -- BEGIN solution here...
>>> >
>>> > > > -- Create table
>>> > > > create table TABLE_A
>>> > > > (
>>> > > >   COL_PK NUMBER not null,
>>> > > >   COL1   VARCHAR2(10),
>>> > > >   COL2   VARCHAR2(10)
>>> > > > );
>>> >
>>> > > > -- Create table
>>> > > > create table TABLE_B
>>> > > > (
>>> > > >   COL_PK NUMBER not null,
>>> > > >   COL1   VARCHAR2(10)
>>> > > > );
>>> >
>>> > > > -- Create table
>>> > > > create table TABLE_C
>>> > > > (
>>> > > >   COL_PK NUMBER not null,
>>> > > >   COL2   VARCHAR2(10)
>>> > > > );
>>> >
>>> > > > -- Create/Recreate primary, unique and foreign key constraints
>>> > > > alter table TABLE_C
>>> > > >   add constraint TABLE_C_PK primary key (COL_PK)
>>> >
>>> > > > -- Create/Recreate primary, unique and foreign key constraints
>>> > > > alter table TABLE_B
>>> > > >   add constraint TABLE_B_PK primary key (COL_PK)
>>> >
>>> > > > -- Create/Recreate primary, unique and foreign key constraints
>>> > > > alter table TABLE_A
>>> > > >   add constraint TABLE_A_PK primary key (COL_PK)
>>> >
>>> > > > insert into table_a ( col_pk, col1, col2 ) values ( 1, null, null
>>> );
>>> > > > insert into table_a ( col_pk, col1, col2 ) values ( 2, null, null
>>> );
>>> > > > insert into table_a ( col_pk, col1, col2 ) values ( 3, null, null
>>> );
>>> > > > insert into table_a ( col_pk, col1, col2 ) values ( 4, null, null
>>> );
>>> > > > insert into table_a ( col_pk, col1, col2 ) values ( 5, null, null
>>> );
>>> > > > insert into table_a ( col_pk, col1, col2 ) values ( 6, null, null
>>> );
>>> > > > insert into table_a ( col_pk, col1, col2 ) values ( 7, null, null
>>> );
>>> > > > insert into table_a ( col_pk, col1, col2 ) values ( 8, null, null
>>> );
>>> > > > insert into table_a ( col_pk, col1, col2 ) values ( 9, null, null
>>> );
>>> > > > insert into table_a ( col_pk, col1, col2 ) values ( 10, null, null
>>> );
>>> > > > commit;
>>> >
>>> > > > insert into table_b ( col_pk, col1 ) values ( 1, 'BLUE' );
>>> > > > insert into table_b ( col_pk, col1 ) values ( 2, 'GREEN' );
>>> > > > insert into table_b ( col_pk, col1 ) values ( 3, 'RED' );
>>> > > > insert into table_b ( col_pk, col1 ) values ( 8, 'YELLOW' );
>>> > > > insert into table_b ( col_pk, col1 ) values ( 9, 'ORANGE' );
>>> > > > commit;
>>> >
>>> > > > insert into table_c ( col_pk, col2 ) values ( 2, 'A' );
>>> > > > insert into table_c ( col_pk, col2 ) values ( 4, 'B' );
>>> > > > insert into table_c ( col_pk, col2 ) values ( 5, 'C' );
>>> > > > insert into table_c ( col_pk, col2 ) values ( 6, 'D' );
>>> > > > insert into table_c ( col_pk, col2 ) values ( 8, 'E' );
>>> > > > commit;
>>> >
>>> > > > select * from table_a
>>> >
>>> > > > -- update query
>>> >
>>> > > > update (
>>> >
>>> > > > select a.col_pk as pka,
>>> > > >    a.col1 as col1,
>>> > > >    a.col2 as col2,
>>> > > >    b.col_pk as pkb,
>>> > > >    b.col1 as col1b,
>>> > > >    c.col_pk as pkc,
>>> > > >    c.col2 as col2c
>>> > > >   from table_a a
>>> > > >   left outer join table_b b
>>> > > >     on a.col_pk = b.col_pk
>>> > > >   left outer join table_c c
>>> > > >     on a.col_pk = c.col_pk
>>> >
>>> > > > ) set col1 = col1b, col2 = col2c;
>>> >
>>> > > > commit;
>>> >
>>> > > > -- table comparisons
>>> >
>>> > > > SQL> select * from table_a
>>> > > >   2  /
>>> >
>>> > > >     COL_PK COL1       COL2
>>> > > > ---------- ---------- ----------
>>> > > >          1 BLUE
>>> > > >          2 GREEN      A
>>> > > >          3 RED
>>> > > >          4            B
>>> > > >          5            C
>>> > > >          6            D
>>> > > >          7
>>> > > >          8 YELLOW     E
>>> > > >          9 ORANGE
>>> > > >         10
>>> >
>>> > > > 10 rows selected
>>> >
>>> > > > SQL> select * from table_b
>>> > > >   2  /
>>> >
>>> > > >     COL_PK COL1
>>> > > > ---------- ----------
>>> > > >          1 BLUE
>>> > > >          2 GREEN
>>> > > >          3 RED
>>> > > >          8 YELLOW
>>> > > >          9 ORANGE
>>> >
>>> > > > SQL> select * from table_c
>>> > > >   2  /
>>> >
>>> > > >     COL_PK COL2
>>> > > > ---------- ----------
>>> > > >          2 A
>>> > > >          4 B
>>> > > >          5 C
>>> > > >          6 D
>>> > > >          8 E
>>> >
>>> > > > SQL>
>>> >
>>> > > > Rich Pascual
>>> > > > Database Programmer
>>> > > > IT Systems Management
>>> > > > U.C. Berkeley
>>> >
>>> > > > On Wed, Sep 1, 2010 at 9:55 AM, swaroop gowda <
>>> swaroop.t...@gmail.com
>>> > > >wrote:
>>> >
>>> > > > > Can we arite update statement like below,
>>> > > > > UPDATE TABLE_A A
>>> > > > > SET A.COL1 = (SELECT B.COL1 FROM TABLE B WHERE A.COL_PK =
>>> B.COL_PK),
>>> > > > > A.COL2 = (SELECT C.COL2 FROM TABLE C WHERE A.COL_PK = C.COL_PK)
>>> >
>>> > > > > I tried for single like below but I am facing one issue. The
>>> issue is
>>> > > when
>>> > > > > ever there is a match it is updating whole TABLE_A A.COL1 to
>>> NULL.
>>> > > > > Basically it should update when there is a match else if the
>>> subquery
>>> > > > > returns no data should not update anything. Please let me know
>>> how can
>>> > > I do
>>> >
>>> > > > >  UPDATE TABLE_A A
>>> > > > > SET A.COL1 = (SELECT B.COL1 FROM TABLE B WHERE A.COL_PK =
>>> B.COL_PK);
>>> >
>>> > > > > --
>>> > > > > Thanks & Regards
>>> > > > > Swaroop Thailuru Swamy
>>> >
>>> > > > >  --
>>> > > > > You received this message because you are subscribed to the
>>> Google
>>> > > > > Groups "Oracle PL/SQL" group.
>>> > > > > To post to this group, send email to
>>> Oracle-PLSQL@googlegroups.com
>>> > > > > To unsubscribe from this group, send email to
>>> > > > > oracle-plsql-unsubscr...@googlegroups.com
>>> > > > > For more options, visit this group at
>>> > > > >http://groups.google.com/group/Oracle-PLSQL?hl=en-Hide quoted
>>> text -
>>> >
>>> > > > - Show quoted text -
>>> >
>>> > > --
>>> > > You received this message because you are subscribed to the Google
>>> > > Groups "Oracle PL/SQL" group.
>>> > > To post to this group, send email to Oracle-PLSQL@googlegroups.com
>>> > > To unsubscribe from this group, send email to
>>> > > oracle-plsql-unsubscr...@googlegroups.com
>>> > > For more options, visit this group at
>>> > >http://groups.google.com/group/Oracle-PLSQL?hl=en
>>> >
>>> > --
>>> > Thanks & Regards
>>> > Swaroop Thailuru Swamy- Hide quoted text -
>>>  >
>>> > - Show quoted text -
>>>
>>> --
>>> You received this message because you are subscribed to the Google
>>> Groups "Oracle PL/SQL" group.
>>> To post to this group, send email to Oracle-PLSQL@googlegroups.com
>>> To unsubscribe from this group, send email to
>>> oracle-plsql-unsubscr...@googlegroups.com
>>> For more options, visit this group at
>>> http://groups.google.com/group/Oracle-PLSQL?hl=en
>>>
>>
>>
>>
>> --
>>    Thanks & Regards
>> Swaroop Thailuru Swamy
>>
>> --
>> You received this message because you are subscribed to the Google
>> Groups "Oracle PL/SQL" group.
>> To post to this group, send email to Oracle-PLSQL@googlegroups.com
>> To unsubscribe from this group, send email to
>> oracle-plsql-unsubscr...@googlegroups.com
>> For more options, visit this group at
>> http://groups.google.com/group/Oracle-PLSQL?hl=en
>>
>
> --
>  You received this message because you are subscribed to the Google
> Groups "Oracle PL/SQL" group.
> To post to this group, send email to Oracle-PLSQL@googlegroups.com
> To unsubscribe from this group, send email to
> oracle-plsql-unsubscr...@googlegroups.com
> For more options, visit this group at
> http://groups.google.com/group/Oracle-PLSQL?hl=en
>



-- 
Thanks & Regards
Swaroop Thailuru Swamy

-- 
You received this message because you are subscribed to the Google
Groups "Oracle PL/SQL" group.
To post to this group, send email to Oracle-PLSQL@googlegroups.com
To unsubscribe from this group, send email to
oracle-plsql-unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/Oracle-PLSQL?hl=en

Reply via email to