2016-05-13 77 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