如何:在不使用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它为您提供了一个跟踪任何问题的内置路径。