选择一行X次

And*_*ndy 1 sql sql-server

我有一个非常具体的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)设置每个物理文章的位置

pet*_*erm 6

你可以这样做

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 |