我能更新一个cte吗?

5
使用公共表达式,我尝试完成以下操作。
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

但是出现了以下错误。

错误:关系“cte”不存在

看起来我可以在 WITH 之后执行 INSERTDELETE 操作,但是只能在 cte 内部执行 UPDATE 操作,这是正确的吗?我确定我做过类似的操作,但可能是在另一个数据库中。

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
1个回答

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;

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

1
是的,我对SQL Server的句法感到困惑。https://dev59.com/xmgu5IYBdhLWcg3wHjl7 - Juan Carlos Oropeza

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接