Oracle FETCH FIRST 1 ROW с оператором UNION ALL - PullRequest
0 голосов
/ 08 апреля 2020

Я пытаюсь создать оператор UNION ALL в SQL, используя FETCH FIRST 1 ROW, однако, когда я это делаю, он выдает ошибку MISSING KEYWORD

Вот как выглядит мой SQL :

Select * From tabl1 where Date = '04-MAR-2020' FETCH FIRST 1 ROW

UNION ALL

Select * From tabl1 where Date = '05-MAR-2020' FETCH FIRST 1 ROW

что-то вроде этого выполнимо. Я хотел бы сохранить это как одно утверждение, а не добавлять SUBQUERY или что-либо в этом роде.

Ответы [ 3 ]

2 голосов
/ 08 апреля 2020

Просто поставьте каждую часть в скобках. Работает в 12.2, в любом случае:

( Select * From tabl1 where Date = '04-MAR-2020' FETCH FIRST 1 ROW )
UNION ALL
( Select * From tabl1 where Date = '05-MAR-2020' FETCH FIRST 1 ROW )

Мой актуальный тестовый запрос для всех, кто заинтересовался, был следующим:

(select   object_name 
 from     user_objects 
 where    object_type = 'TABLE' 
 order by object_name 
 fetch first 1 row only)
UNION ALL
(select   object_name 
 from     user_objects 
 where    object_type = 'VIEW' 
 order by object_name 
 fetch first 1 row only);
1 голос
/ 08 апреля 2020

Вместо этого можно использовать row_number():

select t.*
from mytable t
where date in (date '2020-03-04', date '2020-03-05')
order by row_number() over(partition by trunc(date) order by date)
fetch first 1 row with ties

row_number() помещает каждый день в другой раздел и упорядочивает записи каждого дня по возрастанию. Затем можно использовать предложение ограничения строки с параметром with ties, чтобы получить первую запись в день.

Это более эффективно, чем решение union all, поскольку оно сканирует таблицу только один раз.


Если вы делаете хотите union all, то вы можете сделать:

select *
from (
    (select * from tabl1 where date = date '2020-03-04' order by date fetch first 1 row)
    union all
    (select * from tabl1 where date = date '2020-03-05' order by date fetch first 1 row)
)
0 голосов
/ 08 апреля 2020

Попробуйте это

Select * From tabl1 where Date = '04-MAR-2020' and ROWNUM <= 1
UNION ALL
Select * From tabl1 where Date = '05-MAR-2020' and ROWNUM <= 1
...