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

Home -> Community -> Mailing Lists -> Oracle-L -> Re: Unique(ish) sequence question

Re: Unique(ish) sequence question

From: Mike Spalinger <Michael.Spalinger_at_Sun.COM>
Date: Fri, 20 Feb 2004 11:52:13 -0700
Message-id: <4036575D.9040407@sun.com>


David,

Here's an ugly solution using row_number(). I'm not sure it's any better than what you already have.

SQL> select * from mike;

COL1 COL2 KEY
---------- ---------- ----------

a          a
a          a
a          a
b          b
c          c
c          c

6 rows selected.

update mike b

    set key = (select distinct a.key

                  from (select col1, col2,
                               row_number()
                                  over (order by col1, col2) key
                           from (select distinct col1, col2 from mike)) a
                  where a.col1 = b.col1
                    and a.col2 = b.col2)
    where exists (select 1
                  from (select col1, col2,
                               row_number()
                                  over (order by col1, col2) key
                           from (select distinct col1, col2 from mike)) a
                  where a.col1 = b.col1
                    and a.col2 = b.col2);

SQL> select * from mike;

COL1 COL2 KEY
---------- ---------- ----------

a          a                   1
a          a                   1
a          a                   1
b          b                   2
c          c                   3
c          c                   3

6 rows selected.

With no indexes, AUTOTRACE shows 3 full scans:

Execution Plan


    0 UPDATE STATEMENT Optimizer=CHOOSE     1 0 UPDATE OF 'MIKE'

    2    1     FILTER
    3    2       TABLE ACCESS (FULL) OF 'MIKE'
    4    2       VIEW
    5    4         VIEW
    6    5           SORT (UNIQUE)
    7    6             TABLE ACCESS (FULL) OF 'MIKE'
    8    1     SORT (UNIQUE)
    9    8       VIEW
   10    9         WINDOW (BUFFER)
   11   10           VIEW
   12   11             SORT (UNIQUE)
   13   12               TABLE ACCESS (FULL) OF 'MIKE'

Mike

Lord David wrote:
> Hi
>
> I need to add a sequence number to a table that is unique for *distinct*
> rows. I can generate the number like this: -
>
> select rownum, x, y, z from (select distinct x, y, z from blah);
>
> I could do it in plsql a bit like this (in practice I would have to use
> dbms_sql as both the table name and the list of columns is generated
> dynamically): -
>
> i := 1
> for rec in (select distinct x, y, z from blah) loop
> update blah set id = i where x = rec.x and y = rec.y and z = rec.z
> i := i + 1
> end loop;
>
> The main problem is the expense of the update (a full table scan per value
> of i). The tables are basically uploads from spreadsheets, so the list of
> columns may be quite long (10-100) and each table is only likely to be used
> a few times. Hence, I cannot see that there is any point in adding indexes.
>
> Any ideas would be greatly appreciated.
>
> --
> David Lord
>
>
>
> *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
> This e-mail and its attachments are intended for the
> author's addressee only and may be confidential.
>
> If they have come to you in error you must take no
> action based on them, nor must you copy or show
> them to anyone; please reply to this e-mail and
> highlight the error.
>
> Please note that this e-mail has been created in the
> knowledge that Internet e-mail is not a 100% secure
> communications medium. We advise that you
> understand and observe this lack of security when
> e-mailing us. Steps have been taken to ensure this
> e-mail and attachments are free from any virus, but
> advise the recipient to ensure they are actually virus
> free.
>
> The views, opinions and judgments expressed in this
> message are solely those of the author. The message
> contents have not been reviewed or approved by Iron
> Mountain.
>
> *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
> ----------------------------------------------------------------
> Please see the official ORACLE-L FAQ: http://www.orafaq.com
> ----------------------------------------------------------------
> To unsubscribe send email to: oracle-l-request_at_freelists.org
> put 'unsubscribe' in the subject line.
> --
> Archives are at http://www.freelists.org/archives/oracle-l/
> FAQ is at http://www.freelists.org/help/fom-serve/cache/1.html
> -----------------------------------------------------------------



Please see the official ORACLE-L FAQ: http://www.orafaq.com

To unsubscribe send email to: oracle-l-request_at_freelists.org put 'unsubscribe' in the subject line.
--
Archives are at http://www.freelists.org/archives/oracle-l/
FAQ is at http://www.freelists.org/help/fom-serve/cache/1.html
-----------------------------------------------------------------
Received on Fri Feb 20 2004 - 14:27:39 CST

Original text of this message

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