postgres<>mssql update syntax

Hallo,

ich habe bisher mit dem SQL Server gearbeit und will/muss/möchte jetzt Postgres benutzen :wink: . Jetzt habe ich mal eine recht spezielle Frage zur Syntax des update-Befehls. Im SQL Server kann ich so etwas schreiben:

update p – p ist der selbe Alias wie in der from-Klausel
set lastLoggerMeasurementDate = (select max(dataDate) from
tblEffBlockData where efficiencyBlockId = el.efficiencyBlockId)
from tblLogger dl
join tblPlant p on dl.plantId = p.plantId
join viewEffBlockLogger el on el.loggerId = dl.loggerId

Mein Probelm ist, dass ich im SQL Server im update-Teil einen Alias verwenden kann, der in der from-Klausel definiert ist. Natürlich funktioniert das jetzt nicht mehr so, da Postgres den Alias als Tabelle interpretiert. Was ich eigentlich machen will:

update alle Zeilen in tblPlant und berechne für jede Zeile den Wert für ‘lastLoggerMeasurementDate’. Dieser Wert kann mit

select max(dateDate) from tblEffBlockData where efficiencyBlockId = xxx

ermittelt werden. Die efficiencyBlockId kommt aus dem join in der from-Klausel, wie oben zu sehen.

Vielleicht kann mir jemand helfen, diese Abfrage in Postgres neu zu schreiben. Was bei mir nicht funktioniert hat, ist folgendes Beispiel:

update tblPlant
set lastLoggerMeasurementDate = (select max(dataDate) from
tblEffBlockData where efficiencyBlockId = el.efficiencyBlockId)
from tblLogger dl
join tblPlant p on dl.plantId = p.plantId
join viewEffBlockLogger el on el.loggerId = dl.loggerId

In diesem Fall hatten alle Einträge in tblPlant den gleichen Wert, was nicht unbedingt gewollt ist :wink:

Vielen Dank
Lothar

Also sowas wie folgt:

test=*# select * from t1;
 id | max_date
----+----------
  1 |
  2 |
  3 |
(3 rows)

test=*# select * from t2;
 id |     d
----+------------
  1 | 2007-01-01
  1 | 2007-02-01
  1 | 2007-03-01
  2 | 2007-03-01
  3 | 2007-03-01
  3 | 2007-04-01
(6 rows)

test=*# update t1 set max_date = (select max(d) from t2 where t1.id=t2.id);
UPDATE 3
test=*# select * from t1;
 id |  max_date
----+------------
  1 | 2007-03-01
  2 | 2007-03-01
  3 | 2007-04-01
(3 rows)

Oder hab ich Dich flasch verstanden?


Andreas

Hallo,

Vielen Dank für die schnelle Antwort. Ich bin halt schon zu stark auf den SQL Server fokussiert :wink: Folgendes select scheint erstmal zu funktionieren:

update plant
set lastLoggerMeasurementDate =
(
select max(dataDate)
from loggermeasurementdata m , datalogger dl
where m.datalogger_id = dl.id and dl.id = plant.datalogger_id)
)
,
lastInverterMeasurementDate =
(
select max(dataDate)
from invertermeasurementdata m, inverter i
where m.inverter_id = i.id and i.plant_id = plant.id )
)

Lothar