it-swarm.com.de

Aktualisieren Sie die Spalte mit Daten aus einer anderen Tabelle

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

11
user3001937

Die richtige Form wäre (unter der Annahme der aktuellen Version 9.3 wegen fehlender Informationen):

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 WHERE -Klausel ist optional, um leere Aktualisierungen 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 A und B (dh ohne Verknüpfungsbedingung ) und wählt dann eine beliebige Zeile aus (LIMIT 1 ohne ORDER BY). Anschließend werden die Werte aus dieser beliebigen Zeile verwendet, um alle Zeilen der Tabelle C zu aktualisieren. Wenn Sie möchten, dass unterschiedliche Werte für unterschiedliche Zeilen von C verwendet werden, müssen Sie die 3 Tabellen verknüpfen (mit JOIN - ON und WHERE)

Einzelheiten finden Sie im Handbuch zu UPDATE.

19

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
0
dimitar