2016-05-13 117 views
0

使用循环我有两个表如何:选择和插入父子记录,而不在SQL

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 

什么是最好的办法,如果我要复制这些表到类似的表中的所有记录(PostedOrder和PostedOrderItem)在PostedOrderItem表中保留正确的PostedOrderId。实际上,我在Order表中有大约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是自动递增的主键各自表所示。

任何最好的方法,我应该遵循循环彻底与选择的问题?

在此先感谢您,并为激烈的格式化道歉。

+2

这个问题不清楚。为什么你需要循环才能将记录插入到新表中?一个SQL INSERT'会做的。不需要循环。 –

+0

你是什么意思“相似表格”?什么是“订单表”,你只有OrderedStock和OrderItem?你是否试图从'OrderedStock'中取出行并将它们放入'OrderItem'中?或者试图从'OrderItem'获取行并将其放入'OrderedStock'?或试图从这两个表中取出行并将它们放入另一个表中?请显示您想要的结果的一些示例输出。 –

+0

Devlin:我必须将OrderStock和OrderItemTable分别复制到PostedOrder和PostedOrderItem表中。 源表格是1. OrderStock 2。OrderItem的 目标表是1 PostedOrder 2. PostedOrderItem 希望它澄清的问题保罗 –

回答

0

在您发布的订单表,您还需要包括一个“原始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为纽带得到新PostedOrderIDPostedOrderItem表。对于PostedOrderItem

示例表模式:

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

注意:如果您有任何理由需要保留原来的ID为项目表,你也可以为添加一列。不需要插入。

插入记录PostedOrderItem

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

我不采摘的OrderId t需要原始的id。PostedOrderId和PostedOrderItemId都是identity(1,1)列。如果你在我的origianl问题中看到目标结果(我最近更新了),你可能会更好地了解我 –

+0

我只需要复制源代码中的一些命令,并将它们保存到新的已发布表格中(当然也可以使用它们的适当的项目) –

+0

@AliRaza - 您**需要从PostedOrder表格的OrderedStock表中获取原始ID,因为它可以用来获取PostedOrderItem表中的PostedOrderID。一旦你插入了你的记录,你可以删除原始的id如果您愿意,可以来自PostedOrder。 –

0

您可以使用两个插入选择基于数据透视表

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 ; 
+0

这样我就会将旧的/原始的OrderId(来自OrderItem)插入到PostsOrderItem表中。在PostedOrderItem中,我需要新生成的(PostedOrderId)作为parentId –

+0

我已经详细阐述了这个问题。希望它现在更清楚。 –

+0

我有更新的答案...希望是有用 – scaisEdge