#recursive-query #pervasive #actian
#рекурсивный запрос #распространенный #actian
Вопрос:
Наша база данных по времени и посещаемости-это всепроникающая/активная база данных Дзен. Что я пытаюсь сделать, так это создать запрос, в котором просто перечислены следующие 14 дней с сегодняшнего дня. Затем я сопоставлю этот список дат с записями сотрудников, чтобы фактически у меня был список людей/дат на следующие 14 дней.
Я довольно легко сделал это с помощью рекурсивного CTE на SQL server. Я также мог бы сделать это с помощью цикла в SQL Server, но я не могу понять это с помощью всепроникающего SQL. Циклы могут существовать только внутри хранимых процедур и триггеров.
Оглядевшись, я подумал, что этот код, который я нашел и адаптировал, может сработать, но это не так (и дальнейшие исследования показывают, что в Pervasive вообще нет рекурсивного варианта.
WITH RECURSIVE cte_numbers(n, xDate) AS ( SELECT 0, CURDATE() 1 UNION ALL SELECT n 1, dateAdd(day,n,xDate) FROM cte_numbers WHERE n lt; 14 ) SELECT xDate FROM cte_numbers;
Я просто подумал, может ли кто-нибудь помочь мне написать SQL-запрос, который дает мне этот список дат, вне хранимой процедуры.
Комментарии:
1. Вы хотели создать (временную) таблицу на следующие 14 дней, но однократное создание таблицы большего размера (и фильтрация) выполняет ту же работу.
Ответ №1:
Когда вы создаете таблицу, подобную этой:
CREATE TABLE dates(d DATE PRIMARY KEY, x INTEGER);
И создайте первую запись, подобную этой:
INSERT INTO dates VALUES ('2021-01-01',0);
Затем вы можете использовать эту инструкцию , которая удваивает количество записей в таблице dates
при каждом ее выполнении. (поэтому вам нужно запустить его пару раз
Когда вы запустите его 10 раз, в таблице dates
будет указана последняя дата 21 октября 2023 года. Когда вы запустите его 12 раз, последняя дата будет 19 марта 2032 года.
INSERT INTO dates SELECT DATEADD(DAY,m.m 1,d), x m.m 1 from dates cross join (select max(x) m from dates) m order by d;
Конечно, столбец x
можно удалить (необязательно) с помощью следующей инструкции, но вы не можете добавить больше записей, используя предыдущую инструкцию:
ALTER TABLE dates DROP COLUMN x;
Наконец, вернуться на следующий 14-й день с сегодняшнего дня:
SELECT d FROM DATES WHERE d BETWEEN CURDATE( ) AND DATEADD(DAY,13,CURDATE());