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?

1voto

Sh_coder Punkte 1

Um eine Tabelle mit einer anderen zu UPDATE, in PostGRE SQL / AWS (SQL Workbench).

In PostGRE SQL müssen Sie Joins in der UPDATE-Abfrage folgendermaßen verwenden:

UPDATE TABLEA set COLUMN_FROM_TABLEA = COLUMN_FROM_TABLEB FROM TABLEA,TABLEB WHERE FILTER_FROM_TABLEA = FILTER_FROM_TABLEB;

Example:

Update Employees Set Date_Of_Exit = Exit_Date_Recorded , Exit_Flg = 1 From Employees, Employee_Exit_Clearance Where Emp_ID = Exit_Emp_ID

Tabelle A - Mitarbeiter Spalten in Tabelle A - Datum_des_Austritts,Mitarbeiter_ID,Austritt_Flg Tabelle B ist - Mitarbeiter_Austritt_Freigabe Spalten in Tabelle B - Austritt_Datum_erfasst,Austritt_Mitarbeiter_ID

1760 Zeilen betroffen

Ausführungszeit: 29.18s

0voto

--Ziel: Aktualisierung ausgewählter Spalten mit join (postgres)--

UPDATE table1 t1      
SET    column1 = 'data' 
FROM   table1    
       RIGHT JOIN table2   
               ON table2.id = table1.id   
WHERE  t1.id IN     
(SELECT table2.id   FROM   table2   WHERE  table2.column2 = 12345)

0voto

lucia Punkte 21

Der erste Weg ist langsamer als der zweite Weg.

Erstens:

DO $$ 
DECLARE 
  page int := 10000;
  min_id bigint; max_id bigint;
BEGIN
  SELECT max(id),min(id) INTO max_id,min_id FROM opportunities;
  FOR j IN min_id..max_id BY page LOOP 
    UPDATE opportunities SET sec_type = 'Unsec'
    FROM opportunities AS opp
    INNER JOIN accounts AS acc
    ON opp.account_id = acc.id
    WHERE acc.borrower = true
    AND opp.sec_type IS NULL
    AND opp.id >= j AND opp.id < j+page;
    COMMIT;            
  END LOOP;
END; $$;

Zweitens:

DO $$ 
DECLARE 
  page int := 10000;
  min_id bigint; max_id bigint;
BEGIN
  SELECT max(id),min(id) INTO max_id,min_id FROM opportunities;
  FOR j IN min_id..max_id BY page LOOP
    UPDATE opportunities AS opp 
    SET sec_type = 'Unsec'
    FROM accounts AS acc
    WHERE opp.account_id = acc.id
    AND opp.sec_type IS NULL
    AND acc.borrower = true 
    AND opp.id >= j AND opp.id < j+page;
    COMMIT;            
  END LOOP;
END; $$;

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