我有一个非常具体的SQL问题.
我有一个给定订单位置的表(每个位置属于一个订单,但这不是问题):
| Article ID | Amount |
|--------------|----------|
| 5 | 3 |
| 12 | 4 |
Run Code Online (Sandbox Code Playgroud)
对于客户,我需要对每个订购的物理项目进行导出,例如
| Article ID | Position |
|--------------|------------|
| 5 | 1 |
| 5 | 2 |
| 5 | 3 |
| 12 | 1 |
| 12 | 2 |
| 12 | 3 |
| 12 | 4 |
Run Code Online (Sandbox Code Playgroud)
如何构建我的select语句给我这个结果?我认为有两个关键任务:
1)根据金额选择一行X次
2)设置每个物理文章的位置
你可以这样做
SELECT ArticleID, n.n Position
FROM table1 t JOIN
(
SELECT a.N + b.N * 10 + 1 n
FROM
(SELECT 0 AS N UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) a
,(SELECT 0 AS N UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) b
) n
ON n.n <= t.amount
ORDER BY ArticleID, Position
Run Code Online (Sandbox Code Playgroud)
注意:子查询n从1到100动态生成一系列数字.如果您执行了大量此类查询,则可以考虑创建持久计数(数字)表并使用它.
这是SQLFiddle演示
或使用递归CTE
WITH tally AS (
SELECT 1 n
UNION ALL
SELECT n + 1 FROM tally WHERE n < 100
)
SELECT ArticleID, n.n Position
FROM table1 t JOIN tally n
ON n.n <= t.amount
ORDER BY ArticleID, Position
Run Code Online (Sandbox Code Playgroud)
这是SQLFiddle演示
两种情况下的输出:
| ARTICLEID | POSITION | |-----------|----------| | 5 | 1 | | 5 | 2 | | 5 | 3 | | 12 | 1 | | 12 | 2 | | 12 | 3 | | 12 | 4 |
| 归档时间: |
|
| 查看次数: |
3302 次 |
| 最近记录: |