我有一张客户订单表。如果产品存在于相关的发票上,我需要将产品插入采购订单。相当多的事情依赖于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
我看到了实现我需要的两种方法,
将TOP(1)从视图插入Purchase Order表并迭代视图,直到插入所有行。
更改产品视图,以便ChangeID自行增加。
我无法将视图转储到临时表中,因为ChangeID没有增加,因此需要通过Top(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