简体   繁体   中英

Oracle SQL Statement Order By

I have got this following query:

    COLUMN INDEX_NAME FORMAT A15 HEADING "INDEX_NAME"
    COLUMN COLUMN_NAME FORMAT A15 HEADING "COLUMN_NAME"
    COLUMN COLUMN_POSITION FORMAT 999999 HEADING "COLUMN_POSITION"

    SELECT INDEX_NAME, COLUMN_NAME, COLUMN_POSITION
    FROM ALL_IND_COLUMNS
    WHERE TABLE_OWNER = 'ABC'

The returned result is as follows:

    INDEX_NAME      COLUMN_NAME     COLUMN_POSITION
    --------------- --------------- ---------------
    SYS_C007963     C_UNAME                       1 
    ORDER_LINE_PKEY OL_ID                         1 
    ORDER_LINE_PKEY OL_O_ID                       2 
    ORDERS_PKEY     O_ID                          1 
    ITEM_PKEY       I_ID                          1 
    CUSTOMER_PKEY   C_ID                          1 
    COUNTRY_PKEY    CO_ID                         1 
    CC_XACTS_PKEY   CX_O_ID                       1 
    AUTHOR_PKEY     A_ID                          1 
    ADDRESS_PKEY    ADDR_ID                       1 

     10 rows selected 

How do i change the sql statement such that it will sort according to the number of repeated INDEX_NAME in ascending order?

For example like this:

    INDEX_NAME      COLUMN_NAME     COLUMN_POSITION
    --------------- --------------- ---------------
    SYS_C007963     C_UNAME                       1  
    ORDERS_PKEY     O_ID                          1 
    ITEM_PKEY       I_ID                          1 
    CUSTOMER_PKEY   C_ID                          1 
    COUNTRY_PKEY    CO_ID                         1 
    CC_XACTS_PKEY   CX_O_ID                       1 
    AUTHOR_PKEY     A_ID                          1 
    ADDRESS_PKEY    ADDR_ID                       1 
    ORDER_LINE_PKEY OL_ID                         1 
    ORDER_LINE_PKEY OL_O_ID                       2

     10 rows selected 

You can count the number for each index and then order by that:

select INDEX_NAME, COLUMN_NAME, COLUMN_POSITION
FROM (SELECT INDEX_NAME, COLUMN_NAME, COLUMN_POSITION,
             count(*) over (partition by INDEX_NAME) as cnt
      FROM ALL_IND_COLUMNS
      WHERE TABLE_OWNER = 'ABC'
     ) t
order by cnt, INDEX_NAME

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM