Иногда хочется вернуть строку БД сразу после обновления. Более того, можно ПРИСОЕДИНЯТЬ дополнительные данные к обновленной строке. Расширения RETURNING и WITH PostgreSQL делают это возможным.

Добавим несколько примеров данных:

CREATE TABLE birthdays
(
    name     TEXT,
    birthday DATE,
    age      SMALLINT
);

INSERT INTO birthdays
VALUES ('James', '1996-01-20', 22),
       ('Peter', '1990-06-18', 28),
       ('John', '1993-09-21', 25);

Используя оператор RETURNING, можно вернуть любые столбцы из обновленных строк. Этот запрос вернет имя, дату рождения и возраст всех обновленных строк:

-- Update age if it is incorrect
UPDATE birthdays
    SET age = date_part('year', age(birthday))
    WHERE date_part('year', age(birthday)) != age 
    RETURNING name, birthday, age;

Операторы WITH позволяют использовать строки SELECTED в запросе (в данном случае update) в другом подзапросе. Давайте сделаем неявное соединение в обновленный день рождения с любимым цветом человека:

CREATE TABLE favourite_colour(name TEXT, colour TEXT);

INSERT INTO favourite_colour
VALUES ('James', 'Green'),
       ('Peter', 'Blue'),
       ('John', 'Magenta');
WITH updated AS (
    UPDATE birthdays
        SET age = date_part('year', age(birthday))
        WHERE date_part('year', age(birthday)) != age 
        RETURNING name, birthday, age)
SELECT updated.*, favourite_colour.colour
    FROM updated, favourite_colour
    WHERE updated.name = favourite_colour.name;

В последнем операторе обновленные строки добавляются к предложению FROM, делая их столбцы доступными для предложений SELECT и WHERE.

Наконец, очистите:

DROP TABLE birthdays;
DROP TABLE favourite_colour

Давай, попробуй!