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

3
假设我有这两个表格:
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来生成基于TABLEA_ID值的ORDER_INDEX,但均未能成功。

  • 您有什么提示可以在普通SQL中完成吗?普通SQL是否能实现?
  • 如果可能的话,是否可以通过PL/SQL实现?如何实现?

非常感谢您的帮助。

3个回答

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

谢谢,这正是我在寻找的。非常感谢你。也感谢其他人 :) - bric3
顺便提一下,你的答案有一个小错误,因为 rownumberrow_number() 始终返回以 1 开头的数字,所以我必须应用减法操作 ROW_NUMBER() OVER(PARTITION BY B.TABLEA_ID ORDER BY B.ID) -1 AS ORDER_INDEX。无论如何,谢谢 :) - bric3

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

0

怎么样?

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

关于ORDER_INDEX的定义


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接