2016-06-29 8 views
-2

ich eine Tabelle mit 50 Spalten haben, können sagen, die a,b,c,d usw.Sql Update Spalte von Spalte Update in einzelnen Anweisung

Ich möchte b aktualisieren von a und c aus dem neuen Wert von b , so b=b+a,c=c+b ,d = c+ d,.. etc Ich möchte kein Update wie Update [table] set b=b+a, c= c+b+a.. usw. machen, weil ich für jede Spaltenaktualisierung eine riesige berechnete Formel schreiben muss, die für jede Spalte größer und komplexer wird.

Die Tabelle, die ich aktualisieren möchte, hat etwa 50 Millionen Zeilen. Ich denke, dass das Erstellen mehrerer Update-Anweisungen eine Art von Selbstmord ist.

Wie soll ich damit umgehen? Denken Sie, dass die Verwendung von Variablen eine gute Idee ist?

Vielen Dank und Entschuldigung für mein Englisch.

Hinweis: Tut mir leid, dass ich meine Frage nicht verstanden habe. Es gibt 50 neue Spalten in einer vorhandenen Tabelle. Die erste neue Spalte, a, wird mithilfe einer Verknüpfung mit anderen Tabellen berechnet. Die zweite neue Spalte, b, wird berechnet, indem das Ergebnis zum neuen Wert von a addiert wird, zu einer Berechnung, die ich mit einem Join mit anderen Tabellen machen möchte (die gleichen Tabellen wie die erste Aktualisierung). Die gleiche Logik gilt für die Berechnung der Werte für alle 50 Spalten.

+0

Sie Frage ist nicht klar. –

+0

Sie sollten Ihre Tabelle normalisiert haben, diese Werte gehören in eine andere Tabelle, die damit in Beziehung steht. Dann wäre das Update und die Formel einfacher. –

+0

Woher wissen wir also, welche Spalten addiert werden sollten, um den Wert der anderen Spalte zu generieren? Gibt es eine Beziehung, die aus dem Spaltennamen abgeleitet werden kann? etwas wie Spalte1, Spalte2? Wie können wir sonst eine dynamische Abfrage oder eine andere Abfrage schreiben, um jede Spalte aus einer Reihe anderer Spalten zu aktualisieren, die weiter inkrementiert werden? – Sam

Antwort

0

AKTUALISIERT: Vielen Dank für Ihre Frage zu aktualisieren. Verwenden Sie unbedingt SUBQUERIES in Ihrer UPDATE Anweisung, um die meiste Arbeit zu erledigen. Sie können indexes in Ihren Abfragen über SARG s in Ihrem ON/WHEREpredicates verwenden.

Da Ihre Logik ist selbst abhängig von den anderen Tabellen für Spalten, etwa wie folgt helfen:

CREATE TABLE #TABLE1 (ColA INT, ID INT IDENTITY(1,1)) 
INSERT INTO #TABLE1 (ColA) VALUES (1) 
CREATE TABLE #TABLE2 (ColB INT, ID INT IDENTITY(1,1) ) 
INSERT INTO #TABLE2 (ColB) VALUES (4) 
CREATE TABLE #TABLE3 (ColC INT, ID INT IDENTITY(1,1) ) 
INSERT INTO #TABLE3 (ColC) VALUES (10) 

SELECT ColC + B.ColB AS ColC, ColC, B.ColB, B.ColA, B.ORIGINAL, B.ID 
FROM #TABLE3 A 
     RIGHT OUTER JOIN (SELECT ColB + B.ColA AS ColB, ColA, ORIGINAL, B.ID 
          FROM #TABLE2 A 
          RIGHT OUTER JOIN (SELECT ColA + ColB AS ColA, ColB AS ORIGINAL, A.ID 
              FROM #TABLE1 A 
              INNER JOIN #TABLE2 B ON A.ID = B.ID) B ON A.ID = B.ID) B ON A.ID = B.ID 

Beachten Sie, dass der Einfachheit halber ich davon ausgegangen, nur die Tabellen, die die gleichen ID Spalten hatte, wie ich gehalten die innere subqueryID in der Liste. SQL geht von rechts nach links (innere Abfragen zuerst), also behalte das im Hinterkopf.

Es könnte eine lange Reihe von Joins sein, aber mindestens der Großteil der repetitiven Logik wird Handles innerhalb der Unterabfragen selbst sein. OUTER JOINS sinnvoll, da Sie den Wert der inneren Abfrage beibehalten und diesen neuen berechneten Wert mit dem nächsten äußeren subquery vergleichen möchten.

0

Sie können versuchen, Update von wählen Sie wie folgt aus.

UPDATE T 
    SET a = T.a 
     ,b = T.b 
     ,c = T.c 
     ,d = T.d 
     ... 
     ... 
    SELECT a 
     ,b = b + a 
     ,c = c + b 
     ,d = d + c 
     ... 
     ... 
FROM yourtable T