2014-11-28 7 views
5

Как использовать ROW_NUMBER() в предложении where в базе данных DB2. Я попытался ниже, но это не сработало:ROW_NUMBER() в DB2

SELECT * FROM CSPAPP.LOCATIONS 
WHERE (ROW_NUMBER() OVER(ORDER BY LOCATION)) BETWEEN 100 AND 200 

Это дало ошибку: Invalid использование статистической функции или функции OLAP.

Я также попытался с followiong способами:

SELECT (ROW_NUMBER() OVER(ORDER BY LOCATION)) AS RN ,* FROM CSPAPP.LOCATIONS 
WHERE RN < 200 

SELECT (ROW_NUMBER() OVER(ORDER BY LOCATION)) AS RN ,LOCATION FROM CSPAPP.LOCATIONS 
WHERE RN < 200 

ответ

4

Вы не можете ссылаться на псевдоним на том же уровне, на котором она определена. Вам нужно обернуть это в производной таблице:

SELECT location 
FROM (
    SELECT row_number() over(order by location) as rn, 
      location 
    FROM cspapp.locations 
) 
WHERE rn < 200 
+0

Большое спасибо за ваше решение, но оно частично служит мой prupose. Я пытаюсь SELECT * FROM ( SELECT row_number() over (упорядочить по местоположению) как rn, * FROM cspapp.locations ) WHERE rn <200 Но это не работает. Можете предложить. – Mandar

+0

"* not working *" не является допустимым сообщением об ошибке DB2. –

+0

oops.Rorry. Ошибка была: «Неожиданный токен * был найден следующим образом« по местоположению »в качестве rn. Ожидаемые токены могут включать: ." Я не могу ввести каждый столбец, потому что в таблице около 600 столбцов. Поэтому я должен использовать * для выбора всех столбцов за один раз. – Mandar

3

я использую что-то вроде этого, при выборе на основе количества строк в ISeries DB2:

SELECT * 
FROM (
    SELECT ROW_NUMBER() OVER(ORDER BY location) as RRN, * 
    FROM CSPAPP.LOCATIONS 
    ) 
WHERE RRN between 100 and 200 

Если вы заинтересованы только в 1-поле, которое вы, возможно, уметь назначать имя для выбора и ссылки на поля:

SELECT DATA.location 
FROM (
    SELECT ROW_NUMBER() OVER(ORDER BY location) as RRN, * 
    FROM CSPAPP.LOCATIONS 
    ) as DATA 
WHERE DATA.RRN between 100 and 200 
+0

Спасибо за вашу помощь. Я попробовал что-то вроде этого: SELECT * FROM cspapp.locations WHERE LOCATION IN (SELECT location FROM (SELECT row_number() over (порядок по местоположению) как rno, LOCATION FROM cspapp.locations) WHERE rno BETWEEN 1000 AND 10000). Он работал. – Mandar

-1

Вы можете ссылаться на псевдоним на том же уровне, на котором он определен. Вам нужно обернуть это в производной таблице:

SELECT T1.* FROM(
     SELECT row_number() over(order by location) as rn ,L.* 
     FROM cspapp.locations L) As T1 
WHERE T1.rn < 200 

Но вы должны понимать, * никогда не быть лучшей практики. Вы должны использовать имя столбца, а не * (L.col1).

0

Вы можете попробовать FETCH FIRST 200 ROWS ONLY вместо row_number. Напишите свой выбор, как обычно, без ROW_NUMBER, закажите все, что вам нужно, и FETCH FIRST x.

Выбор всех столбцов с помощью «*» не является хорошей практикой особенно, если у вас есть 600+ столбцов (и это само по себе плохой дизайн базы данных).

0

без использования функции row_number():

SELECT * FROM 
(SELECT * FROM CSPAPP.LOCATIONS ORDER BY LOCATION FETCH FIRST 200 rows only) 
ORDER BY LOCATION DESC FETCH FIRST 100 rows only; 

With Row number: 

SELECT ROW_NUMBER() OVER(ORDER BY LOCATIONS), LOCATIONS as RNM FROM 
(SELECT * FROM CSPAPP.LOCATIONS ORDER BY LOCATIONS FETCH FIRST 200 rows only) 
ORDER BY LOCATIONS DESC FETCH FIRST 100 rows only; 
Смежные вопросы