Заставить запрос Oracle SQL возвращать хотя бы одну строку при использовании GROUP BY - PullRequest
1 голос
/ 28 мая 2020

При использовании пустого группирующего набора Oracle не будет возвращать никаких строк даже при использовании агрегатных функций.

Например, этот запрос без предложения GROUP BY:

select count(*)
from dual
where 1 = 0;

дает:

  COUNT(*)
----------
         0

, тогда как этот запрос с GROUP BY ():

select count(*)
from dual
where 1 = 0
group by ();

не возвращает никаких строк.

Как я могу заставить Oracle вернуть хотя бы одна строка, даже если запрос содержит предложение GROUP BY?

Можно ли это сделать с помощью GROUPING SETS, ROLLUP, CUBE или другого предложения GROUP BY?

Я бы не хотел использовать UNION ALL.

Ответы [ 2 ]

2 голосов
/ 28 мая 2020

Вы можете использовать CTE и проверить, не возвращает ли group by строки:

with g as (
      select . . .
      from . . .
      group by . . .
     )
select g.*
from g
union all
select g.*
from (select 1 as n from dual) n left join
     g
     on 1 = 0  -- never true
where not exists (select 1 from g)
1 голос
/ 28 мая 2020

Вы можете написать условное агрегирование без какого-либо предложения WHERE в запросе следующим образом:

SQL> select sum(case when 1 = 0 then 1 else 0 end) as res
  2    from dual
  3  group by 1;

       RES
----------
         0

SQL>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...