如何在SELECT语句中生成订单索引值(如列表的顺序)

时间:2012-02-17 16:06:34

标签: sql oracle

假设我有这两个表:

TABLEA          TABLEB
-----------     -----------
ID  | NAME      ID | TABLEA_ID  | NAME
1   |  ...      1  | 1          | ...
2   |           2  | 2          | ...
3   |           3  | 2          |
4   |           4  | 2          |
                5  | 3          |
                6  | 3          |
                7  | 4          | 
                8  | 2          | 

我想要一个SQL SELECT语句,可以在TABLEA.ID = TABLEB.TABLEA_ID时生成此类结果,您可以在此注意我不关心分组或排序,我只想生成递增值< / strong>对于相同 TABLEB.TABLEA_ID的每一行。

ID | TABLEA_ID | ORDER_INDEX | NAME 
1  | 1         | 0           | ...  
2  | 2         | 0           | ...  
3  | 2         | 1           |      
4  | 2         | 2           |      
5  | 3         | 0           |      
6  | 3         | 1           |      
7  | 4         | 0           |      
8  | 2         | 3           |      

我试图在几个子选择组合中使用rownum来生成ORDER_INDEX,具体取决于TABLEA_ID中的值。

  • 您是否有提示在纯SQL中执行此操作,甚至可以使用纯SQL。
  • 是否可以通过PL / SQL?如果可能的话怎么办?

非常感谢你。

3 个答案:

答案 0 :(得分:3)

我相信这就是你想要的:

SELECT B.ID, B.TABLEA_ID, 
       ROW_NUMBER() OVER(PARTITION BY B.TABLEA_ID ORDER BY B.ID) - 1 ORDER_INDEX,
       B.NAME -- OR A.NAME, its not clear on your question
FROM TABLEB B
LEFT JOIN TABLEA A
ON B.TABLEA_ID = A.ID

答案 1 :(得分:2)

这样的事情:

SELECT
    TableB.ID,
    TableB.TableA_ID,
    ROW_NUMBER() OVER(PARTITION BY TableB.TableA_ID ORDER BY TableB.TableA_ID) AS ORDER_INDEX,
    TableB.Name
FROM
    TableA
    JOIN TableB
        ON TableA.ID=TableB.TableA_ID
ORDER BY TableB.ID

答案 2 :(得分:0)

怎么样

ROW_NUMBER() OVER (PARTITION BY TABLEA_ID ORDER BY ID ASC) AS ORDER_INDEX

作为ORDER_INDEX的定义