#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
это тот же принцип, что и там. (Вы можете сделать идентификаторы чувствительными к регистру, если заключите их в двойные кавычки; но использование двойных кавычек не является хорошей практикой, поскольку вы должны использовать один и тот же регистр везде, где используется идентификатор).