2017-02-20 3 views
0

У меня есть строка SQL-запросов, которые необходимо выполнить по порядку, и каждый из них требует запроса WITH. Что-то вроде этого:Рефакторинг PostgreSQL С запросом со многими операциями обновления

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

Вы должны поместить каждое обновление (за исключением последнего) в КТР:

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);