2017-02-08 5 views
0

Ich habe eine Tabelle für Buchungen (table_b), die rund 1,3 Millionen Zeilen hat. Eine zweite Tabelle (table_s) wird verwendet, um festzustellen, wann auf diese Zeilen von einer separaten Anwendung zugegriffen werden muss.SQL Server Zeilen in zweite Tabelle kopieren

Derzeit gibt es Trigger, um einen Datensatz in Tabelle_S zu machen, aber dies hilft nicht bei allen vorhandenen Daten.

Ich glaube, ich brauche eine Abfrage, die die Zeilen auswählt, die in table_b vorhanden sind, aber nicht table_s und dann eine Zeile für jede Zeile einfügen.

Hier ist meine aktuelle Syntax aber nicht denke, es richtig

gebildet wurde
DECLARE @b_id [INT] = 0; 

WHILE(1 = 1) 
BEGIN 
    SELECT TOP 10 
     @b_id = MIN([b].[b_id]) 
    FROM 
     [table_b] AS [b] 
    LEFT JOIN 
     [table_s] AS [s] ON [b].[b_id] = [s].[b_id] 
    WHERE 
     [s].[b_id] IS NULL; 

    IF @b_id IS NULL 
     BREAK; 

    INSERT INTO [table_s] ([b_id], [processed]) 
    VALUES (@b_id, 0); 
END; 
+0

Haben Sie in Betracht gezogen, eine einzigartige zusammengesetzte Tabelle zu erstellen, nur um Ihre Daten zu importieren, indem Sie ein "select in" mit entsprechenden Bedingungen verwenden? –

Antwort

1

syntaktisch alles in Ordnung ist. Aber es gibt einige Missverständnisse in Ihrer Anfrage

select top 10 @b_id = MIN(b.b_id) 

eine Variable nur einen Wert halten kann, auch wenn Sie top 10 auswählen, wird es einzelnen Wert Variablen zuweisen. Ihr aktueller Ansatz wird für jeden nicht existierenden Datensatz eine Schleife durchlaufen.

Ich glaube nicht, dass wir für 1 Million Datensätze einfügen müssen die Einfügung in Chargen aufgeteilt werden. Versuchen Sie diese Art und Weise

+0

das macht viel mehr Sinn. Danke, dass du meine Fehler behoben hast. Top 'Top 10' war nur, um es überschaubar zu machen, während ich die Syntax korrekt bekam –

Verwandte Themen