【问题标题】:Select a row X times选择一行 X 次
【发布时间】:2013-11-18 18:24:10
【问题描述】:

我有一个非常具体的 sql 问题。

我有一个订单位置表(每个位置属于一个订单,但这不是问题):

|  Article ID  |  Amount  |
|--------------|----------|
|     5        |    3     |
|     12       |    4     |

对于客户,我需要对订购的每件实物进行出口,例如

|  Article ID  |  Position  |
|--------------|------------|
|     5        |    1       |
|     5        |    2       |
|     5        |    3       |
|     12       |    1       |
|     12       |    2       |
|     12       |    3       |
|     12       |    4       |

我如何构建我的选择语句来给我这个结果?我认为有两个关键任务:

1) 根据数量选择行X次

2) 为每篇实物文章设置位置

【问题讨论】:

  • 你的问题可能会有答案herehere
  • 谢谢!第一个问题没有对行进行编号,但也许可以在第二步中执行此操作。第二个看起来不错!也许有一种方法(表值函数)可以即时生成这些数字表......

标签: sql sql-server


【解决方案1】:

查询:

SQLFIDDLEExample

SELECT t1.[Article ID],
       t2.number 
FROM Table1 t1,
     master..spt_values t2
WHERE t1.Amount >= t2.number 
AND t2.type = 'P'
AND t2.number <= 255
AND t2.number <> 0

结果:

| ARTICLE ID | NUMBER |
|------------|--------|
|          5 |      1 |
|          5 |      2 |
|          5 |      3 |
|         12 |      1 |
|         12 |      2 |
|         12 |      3 |
|         12 |      4 |

【讨论】:

    【解决方案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
    

    注意: 子查询 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
    

    这里是SQLFiddle演示

    两种情况下的输出:

    |文章编号 |职位 | |-----------|----------| | 5 | 1 | | 5 | 2 | | 5 | 3 | | 12 | 1 | | 12 | 2 | | 12 | 3 | | 12 | 4 |

    【讨论】:

    • 谢谢!也许有一种方法可以通过表值函数动态生成一个数字表。我会检查这个并报告状态!
    • @Andy MySQL 不支持表值函数
    • 哦,我不小心把它标记为mysql。我正在使用 mssql 服务器!
    • @Andy 它也适用于 SQL Server。请参阅使用递归 CTE 的另一个解决方案的更新答案。
    • @Andy 有帮助吗?您的问题需要更多帮助吗?
    猜你喜欢
    • 2010-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-26
    • 1970-01-01
    • 1970-01-01
    • 2011-11-22
    相关资源
    最近更新 更多