Oracle SQL проходит через те же данные и основывает их на текущей дате
Я пытаюсь выбрать одни и те же данные несколько раз с оракулом SQL на основе даты.
Например, на данный момент я написал этот SQL-запрос, чтобы вычислить мой баланс на текущую дату:
select to_char(sysdate, 'DD-MM-YYYY') date,
(
select (
select NVL(sum(bedrag), 0) bedrag
from transactie
where rekening_naar_id = r.id
and datum <= sysdate
and actief = 1
)
-
(
select NVL(sum(bedrag), 0) bedrag
from transactie
where rekening_van_id = r.id
and datum <= sysdate
and actief = 1
)
from dual
)
as balance
from rekening r
where r.id = 2;
Мне было интересно, возможно ли зацикливать те же самые данные несколько раз в одном запросе SQL и выбирать несколько строк, просто увеличивая дату на 1 день каждый раз? Баланс меняется в зависимости от даты, отображаемой на графике.
Я не могу использовать PL/SQL для этого запроса, потому что мне нужно заполнить данные в диаграмме Apex Oracle, и нет возможности использовать PL/SQL для создания диаграммы. Разрешен только действительный запрос SQL или код PL/SQL, который возвращает действительный запрос SQL.
1 ответ
Когда вы думаете "цикл в Oracle SQL", подумайте connect by level
,
Этот пример уходит на 30 дней в будущее.
select d.date1,
(
select (
select NVL(sum(bedrag), 0) bedrag
from transactie
where rekening_naar_id = r.id
and datum <= d.date1
and actief = 1
)
-
(
select NVL(sum(bedrag), 0) bedrag
from transactie
where rekening_van_id = r.id
and datum <= d.date1
and actief = 1
)
from dual
)
as balance
from rekening r
cross join (select trunc(sysdate+(level-1)) as date1
from dual
connect by level < 31) d
where r.id = 2;
Перекрестное соединение такое же, как равнина join my_table
без условий присоединения, или join my_table on 1=1
, Возвращает все комбинации строк в обеих таблицах. В этом случае он возвращает все комбинации строк в rekening
со строками во встроенном представлении с именем d
(который содержит даты на следующие 30 дней). Попробуйте запустить d
просмотр оператора select сам по себе, чтобы увидеть, что он делает.
select trunc(sysdate+(level-1)) as date1
from dual
connect by level < 31;
Соединение по уровню является частным случаем иерархической connect by
пункт. Он генерирует последовательность строк / чисел, что может быть очень полезно. Вот очень простой пример:
select level from dual connect by level < 10;