如何:在不使用sql中的循环的情况下选择和插入父子记录

如何:在不使用sql中的循环的情况下选择和插入父子记录,sql,select,insert,parent-child,Sql,Select,Insert,Parent Child,我有两张桌子 OrderedStock --- OrderID Location 1 Richmond 2 Ohio 3 Queens OrderItem --- OrderItemID OrderID Name 1 1 Perfume 2 1 Blinds 3 2 Ball 4 3

我有两张桌子

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
如果我必须将这些表中的所有记录复制到类似的表(PosteOrder和PosteOrderItem),在PosteOrderItem表中保留正确的PosteOrderId,那么最好的方法是什么。实际上,我在要复制的订单表中有大约45K行,它们的嵌套OrderItem记录约为200万

目标表及其数据如下所示

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是各自表中自动递增的主键

我应该遵循哪种最好的方法,而不必使用精选语句进行循环


提前感谢您,并为您提供的大量格式表示歉意。

您可以使用两种基于透视表的插入选择

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 ;

在过账订单表中,还需要包含“原始id”列。您尚未指定如何生成新id,因此我将假定它是
INT-IDENTITY(1,1)

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  */
在此表中插入记录:

INSERT INTO PostedOrder (Location,OriginalID)
SELECT Location, OrderID FROM OrderedStock
然后,您可以使用原始id作为链接获取
PostedOrderItem
表的新
PostedOrderID

PostedOrderItem
的示例表架构:

PostedOrderItemID INT IDENTITY(1,1) PRIMARY KEY NOT NULL,
PostedOrderID INT NOT NULL, /* foreign key to PostedOrder table */
Name VARCHAR(100)
INSERT INTO PostedOrderItem (PostedOrderID, Name)
SELECT p.PostedOrderID, o.Name
FROM PostedOrder p
INNER JOIN OrderItem o ON o.OrderID = p.OriginalID
注意:如果出于任何原因需要保留items表的原始id,也可以为此添加一列。插入时不需要这样做

将记录插入到
PostedOrderItem

PostedOrderItemID INT IDENTITY(1,1) PRIMARY KEY NOT NULL,
PostedOrderID INT NOT NULL, /* foreign key to PostedOrder table */
Name VARCHAR(100)
INSERT INTO PostedOrderItem (PostedOrderID, Name)
SELECT p.PostedOrderID, o.Name
FROM PostedOrder p
INNER JOIN OrderItem o ON o.OrderID = p.OriginalID

这个问题还不清楚。为什么需要循环才能将记录插入到新表中?SQL
INSERT
就可以了。不需要循环。你所说的“相似表”是什么意思?什么是“订单表”,您只有
OrderedStock
ordereitem
?您是否试图从
OrderedStock
中提取行并将其放入
OrderItem
?或者尝试从
OrderItem
中提取行并将其放入
OrderedStock
?或者尝试从这两个表中提取行并将它们放入另一个表中?Devlin:我必须将OrderStock和OrderItemTable分别复制到PostedOrder和PostedOrderItem表中。源表为1。订单2。OrderItem目标表为1。邮购2。PostedOrderItem希望它能澄清您使用的是哪种DBMS的问题?博士后?Oracle?这样我将把旧的/原始的OrderId(来自OrderItem)插入到PostedOrderItem表中。在PostedOrderItem中,我需要新生成的(PostedOrderId)作为父项,我已经进一步阐述了这个问题。希望现在更清楚。谢谢您的建议,但它并没有用,因为第一个insert语句是在PostedOrder表中插入重复的订单。我想要的是按订单选择,然后将其插入PostedOrder,获取新标识并将其与所有嵌套项一起附加,同时将其插入PostedOrderItem.hmm,但insert into PostedOrderItem再次从OrderStock中选取OrderId,而不是在PostedOrder中生成的新Id:(如果您需要新的itemOrderId…我已经更新了答案,我不需要原始id。PostedOrderId和PostedOrderItemId都是标识(1,1)列。如果您在我的原始问题(我最近更新了)中查看目标结果)你可能会对我的目标有更好的了解。我只需要从来源复制一些订单,并将它们保存到新发布的表中(当然要有正确的项目)@AliRaza-您确实需要PostedOrder表中OrderedStock表的原始id,因为这是在PostedOrderItem表中获取PostedOrderID的一种方法。插入记录后,如果愿意,您可以从PostedOrder中删除原始id列。得到线索-一定会尝试,但仍在寻找解决方案在这里,我可以避免在末尾删除列。感谢您的帮助。根据我的经验,这是最简单的方法。您有两个查询,一个可选的列删除。当我完成类似的数据迁移时,我会保留原始id列一段时间,以防对新记录与旧记录之间的关系有任何疑问。此giv它为您提供了一个跟踪任何问题的内置路径。