it-swarm.com.de

Aktualisieren von Tabellenzeilen in Postgres mithilfe einer Unterabfrage

Unter Verwendung von postgres 8.4 ist es mein Ziel, die vorhandene Tabelle zu aktualisieren:

CREATE TABLE public.dummy
(
  address_id SERIAL,
  addr1 character(40),
  addr2 character(40),
  city character(25),
  state character(2),
  Zip character(5),
  customer boolean,
  supplier boolean,
  partner boolean

)
WITH (
  OIDS=FALSE
);

Zunächst habe ich meine Abfrage mit der Anweisung insert getestet:

insert into address customer,supplier,partner
SELECT  
    case when cust.addr1 is not null then TRUE else FALSE end customer, 
    case when suppl.addr1 is not null then TRUE else FALSE end supplier,
    case when partn.addr1 is not null then TRUE else FALSE end partner
from (
    SELECT *
        from address) pa
    left outer join cust_original cust
        on (pa.addr1=cust.addr1 and pa.addr2=cust.addr2 and pa.city=cust.city 
            and pa.state=cust.state and substring(cust.Zip,1,5) = pa.Zip  )
    left outer join supp_original suppl 
        on (pa.addr1=suppl.addr1 and pa.addr2=suppl.addr2 and pa.city=suppl.city 
                and pa.state=suppl.state and pa.Zip = substring(suppl.Zip,1,5))
    left outer join partner_original partn
        on (pa.addr1=partn.addr1 and pa.addr2=partn.addr2 and pa.city=partn.city
                  and pa.state=partn.state and pa.Zip = substring(partn.Zip,1,5) )
where pa.address_id = address_id

als Neuling kann ich nicht in die Update-Anweisung konvertieren, dh vorhandene Zeilen werden mit den von der Select-Anweisung zurückgegebenen Werten aktualisiert. Jede Hilfe wird sehr geschätzt.

257
stackover

Postgres ermöglicht:

UPDATE dummy
SET customer=subquery.customer,
    address=subquery.address,
    partn=subquery.partn
FROM (SELECT address_id, customer, address, partn
      FROM  /* big hairy SQL */ ...) AS subquery
WHERE dummy.address_id=subquery.address_id;

Diese Syntax ist keine Standard-SQL-Syntax, für diese Art von Abfrage ist sie jedoch wesentlich praktischer als Standard-SQL. Ich glaube, Oracle akzeptiert (zumindest) etwas Ähnliches.

588
Andrew Lazarus

Du bist hinter dem UPDATE FROM Syntax.

UPDATE 
  table T1  
SET 
  column1 = t2.column1 
FROM 
  table t2 
  INNER JOIN table t3 USING (column2) 
WHERE 
  t1.column2 = t2.column2;

Referenzen

96
Brian Webster

Wenn bei der Verwendung eines Joins keine Leistungsverbesserungen erzielt werden, bevorzuge ich Common Table Expressions (CTEs) zur besseren Lesbarkeit:

WITH subquery AS (
    SELECT address_id, customer, address, partn
    FROM  /* big hairy SQL */ ...
)
UPDATE dummy
SET customer = subquery.customer,
    address  = subquery.address,
    partn    = subquery.partn
FROM subquery
WHERE dummy.address_id = subquery.address_id;

IMHO ein bisschen moderner.

41
steevee
update json_source_tabcol as d
set isnullable = a.is_Nullable
from information_schema.columns as a 
where a.table_name =d.table_name 
and a.table_schema = d.table_schema 
and a.column_name = d.column_name;