Создать представление из запроса - оракул - PullRequest
0 голосов
/ 31 января 2019

У меня есть запрос, который используется в Oracle Opex.Возможно ли из этого запроса создать представление, где находится отчет о яшме (Jasper не поддерживает cte).

Примечание: P99_DATE_FROM и P99_DATE_TO являются параметрами!

with cte as (
SELECT
    a.name,
    w.order as order,
    s.num as num,
    w.id,
    (Select count(*) from quant where id = w.id and trunc(date) between :P99_DATE_FROM and :P99_DATE_TO) as QUANT
FROM
    web w
    left outer JOIN tabel_1 a ON a.id = w.id
    left outer JOIN tabel_2 s ON s.id = w.id
WHERE
    (trunc(s.date) between :P99_DATE_FROM and :P99_DATE_TO or :P99_DATE_FROM is null or :P99_DATE_TO is null)

)
    SELECT 
        name,
        SUM(order) as TOTAL,
        SUM(num) as NUM,
        QUANT
    from cte
    group by name,QUANT

Ответы [ 2 ]

0 голосов
/ 31 января 2019

Нормальное использование предложения WITH раскрывается по его альтернативному имени, факторингу подзапроса.Они удобны, когда вы хотите использовать подзапрос более одного раза в нашем запросе, скажем, в двух whatever IN ( sub-query ) фильтрах.

Это не относится к вашему случаю, так что вы можете просто преобразовать CTE во встроенное представление:

SELECT 
    name,
    SUM(order) as TOTAL,
    SUM(num) as NUM,
    QUANT
from  (
    SELECT
        a.name,
        w.order as order,
        s.num as num,
        w.id,
        (Select count(*) 
         from quant 
         where id = w.id and trunc(date) between :P99_DATE_FROM and :P99_DATE_TO) as QUANT
    FROM
        web w
        left outer JOIN tabel_1 a ON a.id = w.id
        left outer JOIN tabel_2 s ON s.id = w.id
    WHERE
        (trunc(s.date) between :P99_DATE_FROM and :P99_DATE_TO
          or :P99_DATE_FROM is null or :P99_DATE_TO is null)
    ) cte
 group by name,QUANT
0 голосов
/ 31 января 2019

Вы можете параметризовать представление , но наличие параметров, предоставленных Apex, делает его (даже) более сложным.

Поскольку вы обращаетесь к CTE только один раз в основном запросе, это будетпроще использовать вместо этого встроенное представление, превратив ваш запрос CTE в подзапрос:

SELECT 
    name,
    SUM(order) as TOTAL,
    SUM(num) as NUM,
    QUANT
from (
    SELECT
        a.name,
        w.order as order,
        s.num as num,
        w.id,
        (Select count(*) from quant where id = w.id and trunc(date) between :P99_DATE_FROM and :P99_DATE_TO) as QUANT
    FROM
        web w
        left outer JOIN tabel_1 a ON a.id = w.id
        left outer JOIN tabel_2 s ON s.id = w.id
    WHERE
        (trunc(s.date) between :P99_DATE_FROM and :P99_DATE_TO or :P99_DATE_FROM is null or :P99_DATE_TO is null)
)
group by name,QUANT
...