Простой выбор с предложением выборки where и offset не работает в oracle

#sql #oracle #oracle11g

#sql #оракул11g

Вопрос:

Я пытаюсь выбрать строки с where условием, и мне потребуется разбивка на страницы. Поэтому я добавил Fetch offset предложение with [to make it dynamic], но затем оно выдает эту ошибку:

ORA-00933: Неправильно завершенная позиция SQL-команды: 414

Мой запрос:

 SELECT
    up.NAME upozilaName_bn,
       up.id upozila,
    dis.NAME districtName_bn,
       dis.id district,
    dv.NAME divisionName_bn,
       dv.id division,
    w.COUNTER_TYPE, w.COUNTER_ID,
    w.STATUS
FROM X w
left join  Y up
    ON w.UPOZILA = up.ID
left JOIN Z dis
    ON w.DISTRICT = dis.id
left join  P dv
    ON w.DIVISION = dv.ID
where 1=1  order by upozilaName_bn asc OFFSET 1 ROWS FETCH NEXT 10 ROWS ONLY;
 

Без FFSET 1 ROWS FETCH NEXT 10 ROWS ONLY этого все в порядке!
Я искал эту ошибку: 933 , но никакой помощи не нашел.
Версия Oracle: 11.2g

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

1. Синтаксис доступен, начиная с Oracle 12c.

Ответ №1:

OFFSET 1 ROWS FETCH NEXT 10 ROWS ONLY доступен из Oracle 12c.

Вместо этого вам нужно выполнить запрос и упорядочить данные; затем сгенерировать номер строки для упорядоченных строк; и, наконец, отфильтровать эти номера строк. Эти шаги должны выполняться в правильном порядке во вложенных подзапросах:

 SELECT *
FROM   (
  SELECT t.*,
         ROWNUM AS rn
  FROM   (
    SELECT up.NAME AS upozilaName_bn,
           up.id AS upozila,
           dis.NAME AS districtName_bn,
           dis.id AS district,
           dv.NAME AS divisionName_bn,
           dv.id AS division,
           w.COUNTER_TYPE,
           w.COUNTER_ID,
           w.STATUS
    FROM X w
    left join  Y up ON w.UPOZILA = up.ID
    left JOIN  Z dis ON w.DISTRICT = dis.id
    left join  P dv ON w.DIVISION = dv.ID
    order by upozilaName_bn asc
  ) T
)
WHERE  rn BETWEEN 2 AND 11;
 

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

1. во-вторых, просто уточнение, select t предназначенное для T установки в качестве псевдонима в конце запроса, верно?

2. @user404 Да, идентификаторы в Oracle не чувствительны к регистру, поэтому псевдоним таблицы / вложенного запроса T и его использование в SELECT предложении — это одно и t.* то же, и они не обязательно должны быть одинаковыми; вы, конечно, можете изменить их на один и тот же регистр, если хотите, но вы уже используетеи up.id up.ID это тот же принцип, что и там. (Вы можете сделать идентификаторы чувствительными к регистру, если заключите их в двойные кавычки; но использование двойных кавычек не является хорошей практикой, поскольку вы должны использовать один и тот же регистр везде, где используется идентификатор).