2017-02-20 72 views
0

我有一个需要按顺序执行的SQL查询字符串,并且每个查询都需要一个WITH查询。事情是这样的:使用许多更新语句重构PostgreSQL WITH查询

WITH diff AS (
    SELECT NOW() - created_at as time_diff FROM table_a ORDER BY created_at DESC LIMIT 1 
) 
UPDATE table_x SET created_at = created_at + (SELECT time_diff FROM diff); 

WITH diff AS (
    SELECT NOW() - created_at as time_diff FROM table_a ORDER BY created_at DESC LIMIT 1 
) 
UPDATE table_y SET created_at = created_at + (SELECT time_diff FROM diff); 

WITH diff AS (
    SELECT NOW() - created_at as time_diff FROM table_a ORDER BY created_at DESC LIMIT 1 
) 
UPDATE table_a SET created_at = created_at + (SELECT time_diff FROM diff); 

这是一个稍微人为的例子,但我们的目的是“移动”的若干表的所有记录的created_at时间戳。由于table_a包含在所有WITH查询中,因此它必须是要更新的最后一个表或其他所有内容都是错误的。

理想我只想做这样的事情:

WITH diff AS (
    SELECT NOW() - created_at as time_diff FROM table_a ORDER BY created_at DESC LIMIT 1 
) 
UPDATE table_x SET created_at = created_at + (SELECT time_diff FROM diff) 
UPDATE table_y SET created_at = created_at + (SELECT time_diff FROM diff) 
UPDATE table_a SET created_at = created_at + (SELECT time_diff FROM diff); 

两个,因为它更简洁,因为这样的顺序将没有真正的问题。但这显然不是合法的语法。

有没有办法在单个查询中完成此操作?

回答

2

你需要把每一次更新(除了最后一个)在CTE:

WITH diff AS (
    SELECT NOW() - created_at as time_diff FROM table_a ORDER BY created_at DESC LIMIT 1 
), upd_x as (
    UPDATE table_x SET created_at = created_at + (SELECT time_diff FROM diff) 
), upd_y as (
    UPDATE table_y SET created_at = created_at + (SELECT time_diff FROM diff) 
) 
UPDATE table_a SET created_at = created_at + (SELECT time_diff FROM diff);