2016-05-13 10 views
0

Ich habe zwei TabellenGewusst wie: wählen und Eltern-Kind-Datensätze einfügen, ohne in 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 

Was ist der beste Ansatz Schleife, wenn ich alle Datensätze aus diesen Tabellen zu den ähnlichen Tabellen (PostedOrder kopieren und PostedOrderItem), wobei die korrekte PostedOrderId in der PostedOrderItem-Tabelle beibehalten wird. In Wirklichkeit habe ich rund 45.000 Zeilen in der Auftragstabelle kopiert und ihre verschachtelten OrderItem-Datensätze sind etwa 2 Millionen.

Zieltabelle und die Daten würden so aussehen

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 und PostedOrderItemId werden automatisch erhöht Primärschlüssel in ihren jeweiligen Tabellen.

Jeder beste Ansatz, dem ich folgen sollte, ohne mit einer ausgewählten Anweisung gründlich zu schleifen?

Vielen Dank im Voraus und Entschuldigung für die drastische Formatierung.

+2

Diese Frage ist unklar. Warum müssen Sie eine Schleife ausführen, um Datensätze in neue Tabellen einzufügen? Ein SQL 'INSERT' wird den Trick machen. Keine Schleife erforderlich. –

+0

Was meinen Sie mit "Ähnliche Tabellen"? Was ist die "Bestellungstabelle", Sie haben nur "OrderedStock" und "OrderItem"? Versuchen Sie Reihen von 'OrderedStock' zu nehmen und sie in' OrderItem' zu legen? Oder versuchen, Reihen von 'OrderItem' zu nehmen und sie in' OrderedStock' zu legen? Oder versuchen, Zeilen von diesen beiden Tabellen zu nehmen und sie in eine andere Tabelle zu legen? Bitte zeigen Sie eine Beispielausgabe Ihres gewünschten Ergebnisses. –

+0

Devlin: Ich muss sowohl OrderStock als auch OrderItemTable in PostedOrder- und PostedOrderItem-Tabellen kopieren. Quellentabellen sind 1. OrderStock 2.OrderItem Zieltabellen sind 1. PostedOrder 2. PostedOrderItem Hoffe es klärt die Frage Paul –

Antwort

0

In geposteten Order-Tabelle, müssen Sie auch eine „Original-ID enthalten, um " Säule. Sie haben nicht angegeben, wie die neue ID generiert werden soll, daher nehme ich an, dass es sich um eine INT IDENTITY(1,1) Spalte handelt.

Beispiel Tabellenschema für 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 Datensätze zu dieser Tabelle:

INSERT INTO PostedOrder (Location,OriginalID) 
SELECT Location, OrderID FROM OrderedStock 

können Sie dann die Original-ID als Link verwenden, um die neuen PostedOrderID für die PostedOrderItem zu erhalten Tabelle.

Beispiel Tabellenschema für PostedOrderItem:

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

Hinweis: Wenn Sie aus irgendeinem Grund die ursprüngliche ID für den Artikel Tisch zu halten, dann können Sie auch eine Spalte für das hinzufügen. Es ist nicht notwendig für Ihren Einsatz.

Insert Datensätze PostedOrderItem:

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

ich don ' t brauchen die ursprüngliche ID. Sowohl PostedOrderId als auch PostedOrderItemId sind Identity (1,1) Spalten.Wenn Sie in das Ziel-Ergebnis in meiner ursprünglichen Frage (die ich in letzter Zeit aktualisiert habe) schauen, werden Sie wahrscheinlich eine bessere Vorstellung von dem, was ich bin –

+0

Ich muss einfach einige Bestellungen aus der Quelle kopieren und in neue Posted-Tabellen (natürlich mit ihren richtigen Artikeln) speichern –

+0

@AliRaza - Sie ** ** brauchen die ursprüngliche ID aus der OrderedStock-Tabelle in der PostedOrder-Tabelle, weil Sie stellt eine Möglichkeit dar, die PostedOrderID in der Tabelle "PostedOrderItem" abzurufen. Sobald Sie Ihre Datensätze eingefügt haben, können Sie die ursprüngliche ID löschen. c olumn von PostedOrder, wenn Sie es wünschen. –

0

Sie zwei Einsatz können auf Pivot-Tabelle wählen basierend

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 ; 

Wenn Sie neue OrderItemID benötigen diese verwenden

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

Auf diese Weise werde ich die alte/ursprüngliche OrderId (aus OrderItem) in die PostedOrderItem-Tabelle einfügen. In PostedOrderItem benötige ich die neu generierte (PostedOrderId) als parentId –

+0

Ich habe die Frage etwas weiter ausgearbeitet. Hoffe es ist jetzt klarer. –

+0

Ich habe update die Antwort ... Hoffnung ist nützlich – scaisEdge