Удаление строк из POSTGRES по временной метке старше дней, что является результатом выполнения инструкции SELECT из другой таблицы

#sql #postgresql

#sql #postgresql

Вопрос:

Я хочу удалить все строки со значением временной метки старше столбца даты из таблицы в POSTGRES.

Чтобы удалить строки старше определенной временной метки, я использовал это —

SELECT * from gps_coordinates WHERE sattime < NOW() - INTERVAL 7 DAY;

Теперь я хотел получить интервал времени из другой таблицы и удалить строки на основе этого. Я не могу понять, как. Я попробовал это. но это не работает —

DELETE from gps_coordinates where sattime < NOW() - INTERVAL || (SELECT backup_day as days from gps_devices WHERE id=11) || 'DAY'

а также это —

DELETE from gps_coordinates where sattime < NOW() - INTERVAL (SELECT backup_day as days from gps_devices WHERE id=11) || 'DAY'

это выдает ОШИБКУ: синтаксическая ошибка в «SELECT» или рядом с ним

Требуется помощь

Ответ №1:

Вы можете объединять и приводить:

 DELETE FROM gps_coordinates
       WHERE sattime < now()
                       - ((SELECT backup_day
                                  FROM gps_devices
                                  WHERE id = 11)
                          || 'day')::interval;
  

Однако подзапрос всегда должен возвращать не более одной строки.

Ответ №2:

Я думаю, что вы хотите этого:

 DELETE FROM gps_coordinates 
WHERE sattime < NOW() - INTERVAL '1 day' * (SELECT backup_day FROM gps_devices WHERE id=11);
  

Или с помощью функции MAKE_INTERVAL() :

 DELETE FROM gps_coordinates 
WHERE sattime < NOW() - MAKE_INTERVAL(days => (SELECT backup_day FROM gps_devices WHERE id=11));