Страницы

Поиск по вопросам

пятница, 14 февраля 2020 г.

Составить запрос чтобы записи с определённым условием попали в выборку с TOP N rows

#sql #oracle


Есть таблица:

services (id (unique), service_id, user_name, name)


У меня есть запрос, который выбирает 10 строк по определенному user.

select * from services where user_name = 'dev' and rownum <= 10 


мне необходимо изменить запрос так, чтобы если у данного пользователя есть запись
в таблице с service_id = 15, то эта запись попадала в выборку.

В MySql у меня получалось это сделать с помощью Order by + limit, но как это сделать
в Oracle?
    


Ответы

Ответ 1



Попробуйте так: select id, service_id, user_name from services where user_name = 'dev' order by case service_id when 15 then 1 end nulls last fetch first 10 rows only ; Для релизов БД до 12c, где выраженние row limiting было ещё недоступно, преобразуйте в подзапрос: select * from (<запрос без row limiting>) where rownum <= 10

Ответ 2



WITH cte AS ( SELECT id, service_id, user, name, ROW_NUMBER() OVER (PARTITION BY user ORDER BY CASE WHEN service_id = 15 THEN 0 ELSE 1 END, id /* DESC */ ) rn FROM services -- Спасибо товарищу 0xdb /* WHERE user = 'some_user' */ ) SELECT id, service_id, user, name FROM cte WHERE rn <= 10 ORDER BY user, id /* DESC */ ;

Ответ 3



Постановка задачи не ясна. Условие: необходимо изменить запрос так, чтобы если у данного пользователя есть запись в таблице с service_id = 15, то эта запись попадала в выборку Добавьте ограничение к условию отбора and service_id = 15 В случае, если Вам необходимы пользователи, у которых есть запись с service_id равным 15 : select * from services s where s.user = 'dev' -- конкретный пользователь and rownum <= 10 -- результирующее количество строк and s.user in (select c.user from services c where c.service_id = 15) /* все пользователи, у которых service_id = 15

Комментариев нет:

Отправить комментарий