[comp.databases] ORACLE ROWNUM Pseudo-column

daved@usperb.Dayton.NCR.COM (Dave Dresselhouse) (11/15/90)

Is the notion of the ROWNUM pseudo-column valid when joining multiple tables
and performing group functions?

When doing a group function (such as SUM), ORACLE doesn't appear to be
returning a sequential ROWNUM indicating the sequence of the composite row
being returned to the application.

The ORACLE docs are a little sketchy in the definition of the ROWNUM
pseudo-column. Am I misinterpreting the purpose of ROWNUM???

Consider the following simple example:
     List the TOP 100 salespeople according to total earnings.
     This query is derived from the following tables:

                EMP                        EARNINGS
                =========                  =========
                ID  (Employee ID)          ID  (Employee ID)
                NAME  (Employee Name)      TYPE (ie: Salary, Bonus, Comm.)
                                           AMOUNT ($$$)

                                           (Type code 1 indicates Salary,
                                            any other code is Commission.)

     The format of the desired report is:
                                       TOTAL       TOTAL       TOTAL
          EMPLOYEE-ID  EMPLOYEE NAME   SALARY   COMMISSION    EARNINGS
          -----------  -------------   ------   ----------  --------------

     In order to limit the report to the first 100 employees, the following
     query is issued:

          SELECT EMP.ID, EMP.NAME,
                 SUM(DECODE(EARNINGS.TYPE,1,EARNINGS.AMOUNT,0)) SALARY,
                 SUM(DECODE(EARNINGS.TYPE,1,0,EARNINGS.AMOUNT)) COMMISSION,
                 SUM(EARNINGS.AMOUNT) TOTAL_EARNINGS
            FROM EARNINGS, EMP
           WHERE EARNINGS.ID = EMP.ID
             AND ROWNUM <= 100
           GROUP BY EMP.ID, EMP.NAME
           ORDER BY SUM(EARNINGS.AMOUNT) DESCENDING

     The results of this query are unpredictable (wrong). The rows returned
do not match the first 100 rows returned by an identical query without the
ROWNUM constraint! This leads me to believe that the ROWNUM returned is
actually the ROWNUM of some intermediate step in the grouping process, and not
the sequential number of the row being returned to the application. Is it
proper to use the ROWNUM pseudo-column in a query of this type?

----------------------------------------------------------------------------
Dave Dresselhouse                      Dave.Dresselhouse@Dayton.NCR.COM
NCR Corporation
U. S. Group
----------------------------------------------------------------------------

lugnut@sequent.UUCP (Don Bolton) (11/20/90)

In article <561@usperb.Dayton.NCR.COM> daved@usperb.Dayton.NCR.COM (Dave Dresselhouse) writes:
>Is the notion of the ROWNUM pseudo-column valid when joining multiple tables
>and performing group functions?
>
>When doing a group function (such as SUM), ORACLE doesn't appear to be
>returning a sequential ROWNUM indicating the sequence of the composite row
>being returned to the application.
>
ROWNUM is assigned BEFORE the rows are ordered

>The ORACLE docs are a little sketchy in the definition of the ROWNUM
>pseudo-column. Am I misinterpreting the purpose of ROWNUM???
>
>Consider the following simple example:
>     List the TOP 100 salespeople according to total earnings.
>     This query is derived from the following tables:
>
>                EMP                        EARNINGS
>                =========                  =========
>                ID  (Employee ID)          ID  (Employee ID)
>                NAME  (Employee Name)      TYPE (ie: Salary, Bonus, Comm.)
>                                           AMOUNT ($$$)
>
>                                           (Type code 1 indicates Salary,
>                                            any other code is Commission.)
>
>     The format of the desired report is:
>                                       TOTAL       TOTAL       TOTAL
>          EMPLOYEE-ID  EMPLOYEE NAME   SALARY   COMMISSION    EARNINGS
>          -----------  -------------   ------   ----------  --------------
>
>     In order to limit the report to the first 100 employees, the following
>     query is issued:
>
>          SELECT EMP.ID, EMP.NAME,
>                 SUM(DECODE(EARNINGS.TYPE,1,EARNINGS.AMOUNT,0)) SALARY,
>                 SUM(DECODE(EARNINGS.TYPE,1,0,EARNINGS.AMOUNT)) COMMISSION,
>                 SUM(EARNINGS.AMOUNT) TOTAL_EARNINGS
>            FROM EARNINGS, EMP
>           WHERE EARNINGS.ID = EMP.ID
>             AND ROWNUM <= 100
>           GROUP BY EMP.ID, EMP.NAME
>           ORDER BY SUM(EARNINGS.AMOUNT) DESCENDING
>
>     The results of this query are unpredictable (wrong). The rows returned
>do not match the first 100 rows returned by an identical query without the
>ROWNUM constraint! This leads me to believe that the ROWNUM returned is
>actually the ROWNUM of some intermediate step in the grouping process, and not
>the sequential number of the row being returned to the application. Is it
>proper to use the ROWNUM pseudo-column in a query of this type?
>

Never tried ROWNUM, but have made extensive use of ROWID which *is*
Oracle's sequential rownumber.

the SQL Language Refrence Manual Version 6.0 Page 3-26

"Returns a number indicating the sequence in which a row was selected
from a table or set of joined rows.

The first row selected has a ROWNUM of 1, the second has 2,etc"

There is more detail too but I'm a lazy typist :-)