2012-02-17 47 views
3

假設我有這兩個表:如何在SELECT語句生成訂單指數值(如在列表的順序)

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產生這樣的結果,你可以在這裏注意到我不在乎分組或者訂購,我只是想爲的每一行生成一個遞增值相同的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

我相信的定義,這是你想要什麼:

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 
+0

THX這正是我所期待的。非常感謝你。 Thx給其他人:) – Brice 2012-02-17 16:45:32

+0

哦,順便說一句,你的答案有一個小錯誤,因爲'rownumber'或'row_number()'總是返回從1開始的數字,我不得不應用一個減號操作'ROW_NUMBER()OVER(PARTITION BY B.TABLEA_ID ORDER BY B.ID)-1作爲ORDER_INDEX'。無論如何謝謝:) – Brice 2012-02-20 14:28:15

+0

@Brice - 你是對的,我補充說,答案。 – Lamak 2012-02-20 14:36:02

0

如何

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

爲ORDER_INDEX

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 
相關問題