2009-01-14 11 views
35

Ich habe versucht, hier nach einer ähnlichen Lösung zu suchen, habe aber keine gesehen, also habe ich mich gefragt, was der beste Weg ist, um das Folgende zu erreichen.Zeile für jede ID in einer anderen Tabelle in Tabelle einfügen

Ich habe eine Tabelle mit 17 Millionen + Zeilen alle haben eine eindeutige ID. Wir haben kürzlich eine neue Tabelle erstellt, die in Verbindung mit der vorherigen Tabelle verwendet wird, wobei der Fremdschlüssel der neuen Tabelle die eindeutige ID der alten Tabelle ist.

Für z.
Tabelle 1 - id, Feld1, Feld2, field3 ... Tabelle 2 - table1.id, field1 ...

Das Problem ist, da wir diese in einer Live-Umgebung migrieren, müssen wir Tabelle füllen zurück 2 mit einer Zeile, die die ID aus Tabelle 1 für jede Zeile in Tabelle 1 enthält. ex, Tabelle 1 - 1, test, null Tabelle 2 muss jetzt haben: 1, null, ... und so weiter für jede Zeile ist in Tabelle1. Das Hauptproblem ist, dass die IDs in Tabelle 1 nicht alle sequenziell sind. Daher müssen wir aus Tabelle 1 lesen und dann basierend auf der gefundenen ID in Tabelle 2 einfügen.

Gibt es einen einfacheren Weg dazu? Vielen Dank im Voraus Joe

auch zu klären, Tabelle 2 werden neue Daten und das einzige, was es aus der Tabelle 1 ist die ID enthält die Fremdschlüsselbeziehung

auch zu halten, ist diese SQL Server 2000

Antwort

4

Sie müssen diesen Artikel lesen.

What are the most common SQL anti-patterns?

Das Hauptproblem ist, dass der IDs nicht alle sequentielle in Tabelle 1 ist so haben wir aus Tabelle 1 und dann lesen, in der Tabelle gefunden einfügen anhand der ID von 2

Ja, schau dir meine Antwort im obigen Artikel an und schreibe eine Schlüssel-Laufschleife mit Punkt # 2.

Stellen Sie sicher, dass Sie beim Schreiben der Einfügeanweisung eine Feldliste angeben - wie ich in Punkt 1 sage.

11

Ich bin mir nicht sicher, ob ich dir genau folge, aber würde so etwas für dich funktionieren?

INSERT INTO table2 (SELECT field1, field2, field3... FROM table1) 

Wenn ich Verständnis bin richtig wollen Sie einen Datensatz in table2 für jeden Datensatz in Tabelle 1. Das wird genau das tun. Passen Sie einfach Ihre Felder in der Auswahl in der richtigen Reihenfolge an und geben Sie Konstanten für alle Felder in Tabelle 2 an, die Sie in Tabelle 1 nicht haben.

HTH. Lass es mich wissen, wenn ich nicht verstehe und ich werde versuchen, wieder zu helfen.

+0

Ist diese Syntax Arbeit in SQL Server? Wenn ich es versuche, bekomme ich einen Fehler, der sagt "Fehler in der Nähe von SELECT" – Trevor

+0

ja, dies sollte auch für SQL-Server funktionieren. Erstellen Sie eine Frage mit Ihrer Syntax, die einen Fehler auslöst und einen Link sendet, wenn Sie möchten. –

+8

Um es in SQL Server arbeiten zu lassen, musste ich schreiben: INSERT INTO table2 (Feld1, Feld2, Feld3) SELECT field1, field2, field3 FROM table1 – ConnorsFan

-1

Mit diesen vielen Zeilen können Probleme mit Transaktionsprotokollspeicherplatz auftreten und die Ausführungszeit von großen Einfügetransaktionen.

Wenn die Laufzeit ist eine Einschränkung ich ernsthaft mit bcp empfehlen würde (oder was auch immer Werkzeug anwendbar ist je nach Plattform)

aus der ursprünglichen Tabelle, die die IDs auswählen aus, verwenden Sie die BCP-Datei erstellen für die Erweiterungstabelle, dann Bcp es in.

Sie finden es mehr leistungsfähig zu Bcp in Dateien von 10.000 Datensätze anstelle von einer Humungus-Datei mit 17.000.000 Zeilen.

Auch können Sie dies im Hintergrund tun, bevor Sie live gehen, und schreiben Sie einen T-Sql-Job zum Abholen und das wurde möglicherweise eingefügt, nachdem Sie den Snapshop von IDs genommen.

44

Wenn ich richtig verstehe, wollen Sie einen Datensatz in Tabelle2 für jeden Datensatz in Tabelle1. Ich glaube auch, dass table2 neben dem Verweis auf table1 zunächst leere Zeilen enthalten sollte. So

vorausgesetzt

table1 (ID, field1, field2, ...) 
table2 (ID, table1_ID, fieldA, fieldB,...) 
-- where table1_ID is a reference to ID of table1 

Nach table2 Erstellen Sie einfach diese Insert-Anweisung ausführen können

insert into table2(table1_ID) 
select ID from table1 
Verwandte Themen