Aktualisieren Sie die Spalte mit Daten aus einer anderen Tabelle


11

Ich arbeite an einem komplizierten Problem, aber ich werde es auf dieses Problem vereinfachen.

Ich habe zwei Tische

A [ID, column1, column2, column3]
B [ID, column1, column2, column3, column4]

und ich möchte das dritte aktualisieren:

C [ID, column1, column2,column3] 

Ich aktualisiere eine weitere dritte Tabelle mit dieser Abfrage.

UPDATE C 
  set column1=t.firstTab, column2=t.secondTab, column3=t.thirdTab 
  from (select A.column1 as firstTab, B.column2 as secTab, 
              (A.column1 + B.column2) thirdTab 
        from A, B limit 1; ) as t ; 

Ich habe:

UPDATE 0

Wenn ich diese Abfrage ausführe:

select A.column1 as firstTab, B.column2 as secTab, (A.column1 + B.column2) thirdTab 
            from A, B limit 1; 

Ich habe Ergebnisse. Vermisse ich etwas

Beispieldaten: http://sqlfiddle.com/#!15/e4d08/5

Antworten:


19

Die richtige Form wäre (unter der Annahme, dass die aktuelle Version 9.3 mangels Informationen vorliegt):

UPDATE C 
SET    column1 = A.column1 
     , column2 = B.column2 
     , column3 = A.column1 + B.column2
FROM   A
JOIN   B ON A.id = B.id  -- ??? not specified in question!
WHERE  C.id = A.id      --  ??? not specified in question!
AND   (C.column1, C.column2, C.column3) IS DISTINCT FROM
      (A.column1, B.column2, A.column1 + B.column2);

Die letzte WHEREKlausel ist optional, um leere Updates zu vermeiden, die nichts ändern würden (aber dennoch eine neue Zeilenversion zum vollen Preis schreiben).

ypercube gab bereits in seinem Kommentar eine grundlegende Erklärung:

Sie erhalten keine Vervielfältigung. Ihre abgeleitete Tabelle ist Cross Joining Aund B(dh ohne Verknüpfungsbedingung ) und wählt dann eine beliebige Zeile ( LIMIT 1ohne ORDER BY). Anschließend werden die Werte aus dieser beliebigen Zeile verwendet, um alle Tabellenzeilen zu aktualisieren C. Wenn Sie möchten, dass unterschiedliche Werte für unterschiedliche Zeilen von C verwendet werden, müssen Sie die 3 Tabellen (mit JOIN - ONund WHERE) verbinden.

UPDATEEinzelheiten finden Sie im Handbuch .


0

Sie müssen so etwas tun:

UPDATE C 
  set column1=t.firstTab, column2=t.secondTab, column3=t.thirdTab 
  from (select A.column1 as firstTab, B.column2 as secTab, 
              (A.column1 + B.column2) thirdTab 
        from A
        join B  on ...
        where ... ) as t
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.