迭代插入表

时间:2015-07-21 00:00:54

标签: sql sql-server sql-server-2008 tsql

我有一张客户订单表。如果产品存在于相关的发票上,我需要将产品插入采购订单。相当多的事情依赖于Purchase Order表中的数据,所以我所能做的就是构建视图来协助插入。

查看最大值,获取必须随每次插入递增的 MAX(_)+ 1 字段。

NextSalesOrder   FIFOID    ChangeID    NextPO   
---------------------------------------------
102515           300005    26665       1234     

我构建了另一个需要插入采购订单的产品视图。

Invoice       Product    ChangeID
---------------------------------
102515        105        26665   
102516        144        26665
102517        105        26665

我需要将所有这三个值插入Purchase Order表,但每个都必须递增ChangeID。我无法更改表架构。

INSERT INTO [Purchase Order] (Invoice, Product, ChangeID)
SELECT TOP(1) T1.Invoice, T1.Product, T2.ChangeID
FROM dbo.[Invoice] T1, dbo.[Maxes] T2

只要我使用TOP(1),上面的代码就可以正常工作,但我需要一种方法来迭代[Invoice]视图的所有记录,同时增加ChangeID

我看到了实现我需要的两种方法,

  1. 将TOP(1)从视图插入Purchase Order表并迭代视图,直到插入所有行。

  2. 更改产品视图,以便ChangeID自行增加。

  3. 我无法将视图转储到临时表中,因为ChangeID没有增加,因此需要通过Top(1)进行迭代(除非有人知道如何操作)。

    我被困在这里,目前我正在多次调用该程序,因此插入所有行,任何建议都会很棒。

    感谢。

1 个答案:

答案 0 :(得分:1)

您可以使用排名功能对行进行排名,并在查询中使用它。如果您的发票视图中已有ChangeId,则无需再次使用Maxes视图进行连接

INSERT INTO [Purchase Order] (Invoice, Product, ChangeID)
SELECT Invoice
      ,Product
      ,ROW_NUMBER() OVER(PARTITION BY ChangeID ORDER BY ChangeID) + ChangeId - 1
FROM dbo.[Invoice]

此部分ROW_NUMBER() OVER(PARTITION BY ChangeID ORDER BY ChangeID) + ChangeId - 1为每个ChangeId提供一个行号,然后将其添加到ChangeId中,并将结果减去1

样本用法

DECLARE @tbl TABLE (Invoice INT,       Product INT,    ChangeID INT)

INSERT @tbl
SELECT 102515,        105  ,      26665 UNION ALL 
SELECT 102516 ,       144 ,       26665 UNION ALL 
SELECT 102517  ,      105,        26665

SELECT * FROM @tbl

SELECT ROW_NUMBER() OVER(PARTITION BY ChangeID ORDER BY ChangeID) + ChangeId - 1 NewChangeId
       ,ChangeId
FROM @tbl

输出

NewChangeId ChangeId
26665       26665
26666       26665
26667       26665