2016-11-02 2 views
3

CTE Verwendung Ich versucheKann ich eine Cte ​​aktualisieren?

WITH cte as ( 
    SELECT myFieldName, 
      row_number() over (order by gps_device_id) as rn 
    FROM tracker.gps_devices 
) 
UPDATE cte 
SET cte.myFieldName = CASE WHEN cte.rn % 3 = 0 THEN '0' 
          WHEN cte.rn % 3 = 1 THEN '1' 
          WHEN cte.rn % 3 = 2 THEN '2' 
         END 

aber bekam die folgende Fehlermeldung zu tun.

ERROR: relation "cte" does not exist

Sieht aus wie ich INSERT und DELETE nach WITH tun können, aber UPDATE nur innerhalb des CTE, ist das richtig? Ich bin mir sicher, dass ich so etwas gemacht habe, aber vielleicht war es in einer anderen Datenbank.

https://www.postgresql.org/docs/9.6/static/queries-with.html

Also ich damit beendet, auch wenn die Arbeit sehr verwirrend ist, jede Anregung ?.

UPDATE tracker.gps_devices g 
SET g.myFieldName = CASE WHEN t.rn % 3 = 0 THEN '0' 
         WHEN t.rn % 3 = 1 THEN '1' 
         WHEN t.rn % 3 = 2 THEN '2' 
        END 
FROM (SELECT gps_device_id, 
      myFieldName, 
      row_number() over (order by gps_device_id) as rn 
     FROM tracker.gps_devices) as t 
WHERE g.gps_device_id = t.gps_device_id 

Antwort

4

Sie können cte für die Aktualisierung verwenden, z. (Diese ID unter der Annahme ist ein Primärschlüssel):

with cte as ( 
    select 
     id, 
     my_field_name, 
     row_number() over (order by gps_device_id) as rn 
    from gps_devices 
) 
update gps_devices 
set my_field_name = (rn % 3)::text 
from cte 
where gps_devices.id = cte.id; 

Sie einfügen, aktualisieren oder löschen Zeilen einer Tabelle (Ansicht) eher als ein resultset einer Abfrage.

+1

Ja, ich war mit SQL Server Syntaxis verwechselt. http://stackoverflow.com/questions/11562536/update-records-in-table-from-cte –

Verwandte Themen