767 Stimmen

Wie führt man ein Update + Join in PostgreSQL durch?

Im Grunde genommen möchte ich Folgendes tun:

update vehicles_vehicle v 
    join shipments_shipment s on v.shipment_id=s.id 
set v.price=s.price_per_vehicle;

Ich bin mir ziemlich sicher, dass das in MySQL funktionieren würde (mein Hintergrund), aber es scheint in Postgres nicht zu funktionieren. Der Fehler, den ich bekomme, ist:

ERROR:  syntax error at or near "join"
LINE 1: update vehicles_vehicle v join shipments_shipment s on v.shi...
                                  ^

Sicherlich gibt es eine einfache Möglichkeit, dies zu tun, aber ich kann nicht die richtige Syntax finden. Also, wie würde ich dies in PostgreSQL schreiben?

11voto

mpen Punkte 253762

Jetzt geht's los:

update vehicles_vehicle v
set price=s.price_per_vehicle
from shipments_shipment s
where v.shipment_id=s.id;

So einfach, wie ich es machen konnte. Danke, Leute!

Kann auch dies tun:

-- Doesn't work apparently
update vehicles_vehicle 
set price=s.price_per_vehicle
from vehicles_vehicle v
join shipments_shipment s on v.shipment_id=s.id;

Aber dann haben Sie die Fahrzeugtabelle zweimal drin, und Sie dürfen sie nur einmal mit einem Alias versehen, und Sie können den Alias nicht im "Set"-Teil verwenden.

3voto

Blockost Punkte 405

Um all den großartigen Antworten oben etwas ganz Wichtiges hinzuzufügen: Wenn Sie eine join-table haben Sie möglicherweise 2 Probleme:

  • Sie だめ Verwenden Sie die Tabelle, die Sie aktualisieren möchten, um JOIN ein weiteres
  • Postgres will eine ON Klausel nach der JOIN so dass Sie だめ nur verwenden where Klauseln.

Das bedeutet, dass die folgenden Abfragen grundsätzlich nicht gültig sind:

UPDATE join_a_b
SET count = 10
FROM a
JOIN b on b.id = join_a_b.b_id -- Not valid since join_a_b is used here
WHERE a.id = join_a_b.a_id
AND a.name = 'A'
AND b.name = 'B'

UPDATE join_a_b
SET count = 10
FROM a
JOIN b -- Not valid since there is no ON clause
WHERE a.id = join_a_b.a_id 
AND b.id = join_a_b.b_id
a.name = 'A'
AND b.name = 'B'

Stattdessen müssen Sie alle Tabellen in der FROM eine Klausel wie diese:

UPDATE join_a_b
SET count = 10
FROM a, b
WHERE a.id = join_a_b.a_id 
AND b.id = join_a_b.b_id 
AND a.name = 'A'
AND b.name = 'B'

Für manche mag es einfach sein, aber ich bin bei diesem Problem hängen geblieben und habe mich gefragt, was da los ist, und hoffe, dass es anderen hilft.

2voto

Yusuf Punkte 2319

Hier ist ein einfaches SQL, das Mid_Name in der Tabelle Name3 mit dem Feld Middle_Name aus Name aktualisiert:

update name3
set mid_name = name.middle_name
from name
where name3.person_id = name.person_id;

2voto

Alessandro Punkte 503

Der unten stehende Link enthält ein Beispiel, das eine Lösung bietet und hilft, die Verwendung der Software besser zu verstehen. update y join mit Postgres.

UPDATE product
SET net_price = price - price * discount
FROM
product_segment
WHERE
product.segment_id = product_segment.id;

Siehe: http://www.postgresqltutorial.com/postgresql-update-join/

2voto

AritraDB Punkte 195

Erster Tabellenname: tbl_table1 (tab1). Zweiter Tabellenname: tbl_table2 (tab2).

Setzen Sie die Spalte ac_status der tbl_table1 auf "INACTIVE".

update common.tbl_table1 as tab1
set ac_status= 'INACTIVE' --tbl_table1's "ac_status"
from common.tbl_table2 as tab2
where tab1.ref_id= '1111111' 
and tab2.rel_type= 'CUSTOMER';

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X