如何: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
我有两个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
的插入 selectinsert 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