2016-06-20 20 views
0

Ich frage mich, ob das möglich wäre, die folgenden zwei Abfragen oder mehr zu kombinieren? Das aktuelle Verhalten wird die beiden Zeiten der Tabelle Scan auf die TabelleB tun, ich wünschte, nach der Kombination wäre dann einmal scannen auf die TabelleB. Danke.Kombinieren Sie mehrere Update-Anweisungen

update tableA A 
set A.column2=B.column3 
     from tableB B 
     where A.column1 = B.column1 
     B.column2=1111 
     and B.column3 is not null; 


update tableA A 
set A.column2=B.column4 
     from tableB B 
     where A.column1 = B.column1 
     and B.column2=2222 
     and B.column4 is not null; 
+0

Sie würden case-Anweisungen verwenden, um der Abfrage zu ermöglichen, Werte unter verschiedenen Bedingungen festzulegen, die Sie hier haben. Das ähnelt Ihrem Problem: http://stackoverflow.com/questions/35533828/how-to-combine-two-update-queries-having-different-where-condition. – Dresden

+0

Wenn Ihre Abfragen jetzt gelesen werden, besteht keine Verbindung zwischen tableA und tableB. Ist das korrekt? – nscheaffer

+0

@Dresden die Sache ist, dass die Case-Anweisungen erlauben mir nicht zu tun "von wo auswählen" –

Antwort

0

Dies wäre SQL-Server Syntax wäre, und ich bin ziemlich sicher, dass dies überkreuzt, aber ich habe einige Artikel gesehen, die für mysql andere Syntax vorschlagen. Aber verwenden Sie grundsätzlich eine join oder where Klausel, die relate die Tabellen und dann eine case Anweisung verwenden, um Ihren Wert zu wählen. In der folgenden Lösung werden Sie nie die ELSE der case-Anweisung verwenden, aber für eine gute Maßnahme verweisen Sie auf den aktuellen Spaltenwert für alles, was zu Ihren join aber nicht Ihren case Kontoauszugsbedingungen passen würde.

ein

UPDATE a 
    SET Column1 = CASE 
     WHEN b.Column1 = 1111 THEN b.Column2 
     WHEN b.Column1 = 2222 THEN b.Column3 
     ELSE a.Column1 
    END 
FROM 
    [DatabaseA].TableA a 
    INNER JOIN [DatabaseB].TableB b 
    ON a.Column4 = b.Column4 
    AND (
      (b.Column1 = 1111 AND b.Column2 IS NOT NULL) 
      OR 
      (b.Column1 = 2222 AND b.Column3 IS NOT NULL) 
     ) 

Per Ihr Kommentar nicht eine Verknüpfung mit JOIN verwenden.

UPDATE a 
    SET Column1 = CASE 
     WHEN b.Column1 = 1111 THEN (SELECT b.Column2 FROM TableB WHERE b.Column4 = a.Column4) 
     WHEN b.Column1 = 2222 THEN (SELECT b.Column3 FROM TableB WHERE b.Column4 = a.Column4) 
     ELSE a.Column1 
    END 
FROM 
    TableA 
WHERE 
    EXISTS (
     SELECT * 
     FROM 
      TableB 
     WHERE 
      b.Colmn4 = a.Column4 
      AND (
       (b.Column1 = 1111 AND b.Column2 IS NOT NULL) 
       OR 
       (b.Column1 = 2222 AND b.Column3 IS NOT NULL) 
      ) 

so verrückt aussieht, aber es wird aktualisiert, nur die Zeilen, die Sie beabsichtigen. Andernfalls, wenn es Ihnen egal ist, wenn Sie die gesamte Spalte aktualisieren, können Sie so etwas tun.

Sie können es auch mit einem einzelnen Subselect tun, wenn Sie bereit sind, die gesamte Tabelle zu aktualisieren.

UPDATE a 
    SET Column1 = ISNULL(

     (  SELECT (CASE WHEN b.Column1 = 1111 THEN b.Column2 ELSE b.Column3 END) 
     FROM 
      TableB 
     WHERE 
      b.Colmn4 = a.Column4 
      AND (
       (b.Column1 = 1111 AND b.Column2 IS NOT NULL) 
       OR 
       (b.Column1 = 2222 AND b.Column3 IS NOT NULL) 
      ) 
     ),a.Column1)  
FROM 
    TableA 

Der Trick in all diesen Antworten, die Sie haben die SELECT-Anweisung von TableB mit TableA beziehen zu können, sonst werden Sie nicht Ihr gewünschtes Ergebnis bekommen.

+0

In MySQL würden Sie die Anweisung 'FROM' entfernen und die Join-Anweisung in die erste Zeile verschieben:' UPDATE [TableA] a INNER JOIN ... '. – Parfait

+0

Hallo Matt und Parfait, danke für deine Hilfe! Dieser Ansatz wird in mysql/sql funktionieren. –

+0

ich loswerden Aussage zu verbinden, so dass ein anderer Ansatz wie folgt ist: UPDATE ein SET Spalte1 = CASE WENN b.Column1 = 1111 THEN b.Column2 WENN b.Column1 = 2222 THEN b.Column3 ELSE a.Column1 ENDE VON [DatabaseB].TableB b WHERE a.Column4 = b.Column4 UND ( (b.Column1 = 1111 und b.Column2 IS NOT NULL) OR (b.Column1 = 2222 UND b.Column3 IS NOT NULL) ) –

Verwandte Themen