我可以更新CTE吗?

Jua*_*eza 5 sql postgresql common-table-expression

我尝试使用CTE

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
Run Code Online (Sandbox Code Playgroud)

但是出现了以下错误。

错误:关系“ cte”不存在

像我看起来可以做的INSERTDELETE以后WITH,但UPDATE只有CTE里面,是正确的?我确定我做了类似的事情,但是也许在不同的数据库中。

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

因此,即使在工作非常混乱的情况下,我也有任何建议吗?

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
Run Code Online (Sandbox Code Playgroud)

kli*_*lin 5

您可以使用cte进行更新,例如(假设id是主键):

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;
Run Code Online (Sandbox Code Playgroud)

您可以插入,更新或删除表(视图)的行,而不是查询的结果集。