如何:select 并在 sql 中不使用循环插入父子记录

How to: select and insert parent child records without using loop in sql

我有两个Table

OrderedStock
---
OrderID    Location
1          Richmond
2          Ohio
3          Queens


OrderItem
---
OrderItemID  OrderID   Name
1            1         Perfume
2            1         Blinds
3            2         Ball
4            3         Cabinet

如果我必须将这些 table 中的所有记录复制到类似的 table 中(PostedOrder 和 PostedOrderItem),最好的方法是在 PostedOrderItem [=27= 中保留正确的 PostedOrderId ].实际上,我在 Order table 中有大约 45K 行要复制,它们的嵌套 OrderItem 记录大约有 200 万条。

目标 Table 及其数据如下所示

PostedOrdered
---
PostedOrderID    Location
11               Richmond
12               Ohio
13               Queens


PostedOrderItem
---
PostedOrderItemID  PostedOrderID       Name
101                11                  Perfume
102                11                  Blinds
103                12                  Ball
104                13                  Cabinet

PostedOrderId 和 PostedOrderItemId 是它们各自 table 中自动递增的主键。

在不使用 select 语句彻底循环的情况下,我应该遵循的最佳方法是什么?

提前致谢,并对过激的格式表示歉意。

您可以使用两个基于枢轴 table

的插入 select
insert into aTempTable (OrderItemID, OrderID, Name, Location) 
select a.OrderItemID,  a.OrderID,   a.Name,  b.Location 
from OrderItem as a 
inner join OrderedStock as b on a.OrderID = b.OrderID;


insert into  PostedOrder (OrderID, Location) 
select distinct OrderID, Location 
from aTempTable ;


insert into PostedOrderItem (OrderItemID, OrderID, Name) 
select OrderItemID,  OrderID,   Name
from aTempTable ;

如果您需要新的 OrderItemID,请使用此

insert into aTempTable ( OrderID, Name, Location) 
select    a.OrderID,   a.Name,  b.Location 
from OrderItem as a 
inner join OrderedStock as b on a.OrderID = b.OrderID;


insert into  PostedOrder (OrderID, Location) 
select distinct OrderID, Location 
from aTempTable ;


insert into PostedOrderItem ( OrderItemID, OrderID, Name) 
select OrderItemID,  OrderID,   Name
from aTempTable ;

在您的已发布订单 table 中,您还需要包含一个 "original id" 列。您尚未指定如何生成新 ID,因此我假设它是一个 INT IDENTITY(1,1) 列。

示例 table PostedOrder 的架构:

PostedOrderID INT IDENTITY(1,1) PRIMARY KEY NOT NULL,
Location VARCHAR(100),
OriginalID INT NOT NULL  /* This is the id from the original table  */

向此插入记录 table:

INSERT INTO PostedOrder (Location,OriginalID)
SELECT Location, OrderID FROM OrderedStock

然后您可以使用原始 ID 作为 link 以获得 PostedOrderItem table 的新 PostedOrderID .

示例 table PostedOrderItem 的架构:

PostedOrderItemID INT IDENTITY(1,1) PRIMARY KEY NOT NULL,
PostedOrderID INT NOT NULL, /* foreign key to PostedOrder table */
Name VARCHAR(100)

注意:如果出于任何原因您需要保留项目 table 的原始 ID,您也可以为此添加一列。您的插入内容没有必要。

插入记录到 PostedOrderItem:

INSERT INTO PostedOrderItem (PostedOrderID, Name)
SELECT p.PostedOrderID, o.Name
FROM PostedOrder p
INNER JOIN OrderItem o ON o.OrderID = p.OriginalID