(я пометил это PostgreSQL 10, я не знаю, поддерживают ли другие dbs симмильный синтаксис)
У меня есть две таблицы
CREATE TABLE ids (
id SERIAL NOT NULL
);
ALTER TABLE ids ADD PRIMARY KEY (id);
CREATE TABLE ids_tab (
id INTEGER NOT NULL,
ts TIMESTAMP NOT NULL,
FOREIGN KEY(id) REFERENCES ids(id) ON DELETE CASCADE
);
Я хочу написать оператор удаления для удалениявсе записи в идентификаторах (и ids_tab), где MAX (ts) для идентификатора старше N секунд.Я также хотел бы использовать оператор «RETURNING» для печати идентификатора и тс удаленных записей
Это насколько я получил (удалить старше 60 секунд):
WITH expired AS (
SELECT * FROM (
SELECT id, MAX(ts) AS latest
FROM ids_tab
GROUP BY id
) inner_tab
WHERE inner_tab.latest < (NOW() - INTERVAL '60 SECONDS')
)
DELETE FROM ids s
USING expired
WHERE s.id IN (
SELECT
id
FROM expired
)
RETURNING *;
но выход не то, что я ожидал.при выполнении в таблицах
sqld=> select * from ids;
id
----
3
4
(2 rows)
sqld=> select * from ids_tab;
id | ts
----+----------------------------
3 | 2018-10-22 09:45:29.66359
3 | 2018-10-22 09:45:30.633459
4 | 2018-10-22 09:45:47.755611
(3 rows)
результат будет выглядеть так:
id | id | latest
----+----+----------------------------
3 | 3 | 2018-10-22 09:45:30.633459
4 | 3 | 2018-10-22 09:45:30.633459
(2 rows)
Я ожидаю, что он выведет:
id | id | latest
----+----+----------------------------
3 | 3 | 2018-10-22 09:45:30.633459
4 | 4 | 2018-10-22 09:45:47.755611
(2 rows)
Я попытался добавить какой-то видсовместный с «УДАЛИТЬ ИЗ», но я не могу даже сделать хорошо сформированными.