1

我正在使用 mssql 2008 R2,

我有以下结构

    create table #temp (
    product int,
    [order] int,
    ord_qnty int
    )

    insert #temp 
    select 10 ,3,4

现在,如果 ord_qnty 是 4 ,我想选择相同的产品,订购四次,但在所有四行中 ord_qnty 的值应该是 1 ,即

输出应该是

    Product order ord_qnty
    10      3     1
    10      3     1
    10      3     1
    10      3     1
4

2 回答 2

4

如果你有一个数字表,你可以使用它。如果没有,您可以生成一个:

;with Numbers(n) as (
    select ROW_NUMBER() OVER (ORDER BY object_id) from sys.objects
)
select product,[order],1 as ord_qnty
from #temp t inner join Numbers num
    on t.ord_qnty >= num.n

(在我几乎为空的临时数据库中,ROW_NUMBER()生成 77 行。如果这还不够,您可以引入交叉连接或使用其他技巧来生成更多数字,或者您可以创建和填充永久数字表)

于 2013-05-21T07:14:55.393 回答
2

试试这个——

询问:

DECLARE @temp TABLE 
(
      product INT
    , [order] INT
    , ord_qnty INT
)
INSERT @temp(product, [order], ord_qnty) 
SELECT 10, 3, 4

SELECT  
      t.product
    , t.[order]
    , ord_qnty = 1 
FROM @temp t
JOIN [master].dbo.spt_values sv ON t.ord_qnty > sv.number
WHERE sv.[type] = 'p'

SELECT  
      t.product
    , t.[order]
    , ord_qnty = 1 
FROM @temp t
JOIN (
    SELECT number = ROW_NUMBER() OVER (ORDER BY (SELECT 1))
    FROM sys.system_parameters p    
) sv ON t.ord_qnty >= sv.number

输出:

product     order       ord_qnty
----------- ----------- -----------
10          3           1
10          3           1
10          3           1
10          3           1

查询费用:

教授

对于任何“百万价值”:

SET NOCOUNT ON;

DECLARE @numbers TABLE (number INT)

DECLARE @temp TABLE 
(
      product INT
    , [order] INT
    , ord_qnty INT
)
INSERT @temp(product, [order], ord_qnty) 
SELECT 10, 3, 4

DECLARE 
      @i BIGINT = 1
    , @max BIGINT = (
            SELECT MAX(ord_qnty)
            FROM @temp 
        )

WHILE (@i <= @max) BEGIN

    INSERT INTO @numbers (number) 
    VALUES (@i), (@i+1), (@i+2), (@i+3), (@i+4), (@i+5), (@i+6), (@i+7), (@i+8), (@i+9)
    SELECT @i += 10

END

SELECT 
      t.product
    , t.[order]
    , ord_qnty = 1 
FROM @temp t
CROSS JOIN (
    SELECT * 
    FROM @numbers
    WHERE number < @max + 1
) t2
于 2013-05-21T07:16:05.853 回答