2016-06-19 10 views
1

Edit 2: Ich habe den Code in Kommas wie vorgeschlagen aktualisiert und ich habe die Syntax geändert, um es als table.column zu setzen.ALTER und UPDATE Tabellen in SQL basierend auf zwei Kriterien

Ich habe zwei Tabellen in einer SQL-Datenbank (mit Cloud Cloud von Google, wenn das wichtig ist). Die erste Tabelle pre2016q1 hat Spalten Tag und Adsh (und einige andere). Ich möchte Spalten hinzufügen und dann diese Spalten mit Werten aus einer anderen Tabelle füllen num2016q1, die auch die Spalten Tag und adsh wenn die Werte in beiden Tabellen gleich sind.

Hinweis: Dies sind große Tabellen mit je> 2MM Zeilen.

Edit1: Ich frage, bevor ich laufe, weil es lange gedauert hat, um die DB in ihren aktuellen Zustand zu bringen, und ich will das Ganze nicht vermasseln.

Frage 1: Führt der folgende Code den oben beschriebenen Vorgang aus?

Frage 2: Wenn es kein Äquivalent zu Tag ist und adsh werden die Datensätze leer bleiben?

Frage 3: Ist eine Spalte mit dem Namen Wert gehen Probleme verursachen oder sollte ich das vorher umbenennen?

Frage 4: Ist die Größe der Tabelle in der Zeit wichtig, die die Operation dauern wird? (Ich frage nur, weil ich diese Operation 16 Mal machen muss).

ALTER TABLE pre2016q1 
ADD 
    version VARCHAR(20), 
    ddate INTEGER, 
    qtrs INTEGER, 
    uom VARCHAR(20), 
    value NUMERIC(28,4), 
    footnote VARCHAR(512); 

UPDATE 
    pre2016q1 
SET 
    pre2016q1.ddate = num2016q1.ddate, 
    pre2016q1.qtrs = num2016q1.qtrs, 
    pre2016q1.uom = num2016q1.uom, 
    pre2016q1.value = num2016q1.value, 
    pre2016q1.footnote = num2016q1.footnote 
WHERE 
    adsh.pre2016q1 = adsh.num2016q1 AND tag.pre2016q1 = tag.num2016q1; 
+0

Sie müssen num2016q1 beitreten nehmen und es ist wichtig zu wissen, welche Geschmack von SQL Googles Cloud SQL, weil das ist Update/Join-Syntax unterscheidet zwischen MYSQL und SQL-SERVER. –

+0

Die alte Tabellensyntax ist falsch und die set-Anweisung ist falsch. (MYSQL) –

+0

Könnten Sie mir helfen, was falsch ist, besonders im SET-Teil? – user1563247

Antwort

2

Frage 1: ich so etwas wie diese

ALTER TABLE pre2016q1 
ADD 
    version VARCHAR(20) 
    ,ddate INTEGER 
    ,qtrs INTEGER 
    ,uom VARCHAR(20) 
    ,value NUMERIC(28,4) 
    ,footnote VARCHAR(512) 
GO 

UPDATE 
    pre 
SET 
    pre.version = num.version 
    ,pre.ddate = num.ddate 
    ,pre.qtrs = num.qtrs 
    ,pre.uom = num.uom 
    ,pre.value = num.value 
    ,pre.footnote = num.footnote 
FROM pre2016q1 pre 
INNER JOIN num2016q1 num 
    ON pre.adsh = num.adsh AND pre.tag = num.tag 

Frage verwenden würde 2 Die Datensätze werden leer sein.

Frage 3 Gut, wenn Sie es in etwas anderes umbenennen könnten.

Frage 4 Die Menge der Datensätze einen Einfluss hat, aber es wird nicht viel Zeit

+0

Kühl. ein paar Fragen: 1) Was macht die FROM pre2016q1 pre? 2) Was ist der Deal mit pre vs. pre2016q1 und num vs num2016q1? – user1563247

+0

1) Es verbindet die beiden Tabellen. Sie können die Tabellennamen in FROM und INNER JOIN austauschen, aber stellen Sie sicher, dass der Alias-Pre derjenige ist, der in das UPDATE geht. 2) Ich benutze nur einen Alias, um den Begriff kurz zu machen. Sie können den Tabellennamen selbst verwenden, wenn Sie möchten. keine Probleme. – Sam

0

das Update scheint falsch firts den Tabellennamen und nach dem Feldnamen

UPDATE 
    pre2016q1 
SET 
    pre2016q1.version =num2016q1.version 
    pre2016q1.ddate = num2016q1.ddate.num2016q1 
    pre2016q1.qtrs = num2016q1.qtrs 
    pre2016q1.uom = num2016q1.uom 
    pre2016q1.value = num2016q1.value 
    pre2016q1.footnote = num2016q1.footnote 
WHERE 
    pre2016q1.adsh = num2016q1.adsh AND pre2016q1.tag = num2016q1.tag