Как сделать SQL выберите топ N ... в AS400 - PullRequest
27 голосов
/ 17 мая 2010

Как вы выполняете

Select top N * from as400table

запрос типа к базе данных as400 / db2

Ответы [ 4 ]

46 голосов
/ 17 мая 2010
Select col1,col2
from 
as400table
where col1='filter'
order by col1
fetch first N row only

Не забудьте установить предложение ORDER BY, поскольку DB2 не гарантирует, что строки, возвращаемые FETCH FIRST N ROW ONLY, всегда будут одинаковыми N.

13 голосов
/ 30 октября 2013

Строго говоря, в DB2 нет эквивалента TOP N.

SELECT 1 FROM sysibm.sysdummy1
    WHERE EXISTS (SELECT 2 FROM sysibm.sysdummy1)
FETCH FIRST ROW ONLY

компилируется и запускается, но

SELECT 1 FROM sysibm.sysdummy1
    WHERE EXISTS (SELECT 2 FROM sysibm.sysdummy1 FETCH FIRST ROW ONLY)

не скомпилируется.

TOP N и FETCH FIRST N - это не одно и то же. Вы можете использовать FETCH FIRST только один раз для запроса , тогда как TOP N можно использовать в любом суб-выборе .

Вы можете использовать оконную функцию в подзапросе для симуляции TOP N:

select *
from (
    select id, row_number()
    over (order by id) as rn
    from testsch.testtbl
) as r
where r.rn < 100 -- This is N rows you are looking for

Это вернет ровно 99 строк. Я попробовал это в iSeries 7, и это сработало.

0 голосов
/ 10 мая 2016

Не проще ли ограничить результат? Сильфон в порядке по дате, и я беру лучший результат

SELECT banana_equipment_id 
FROM new_banana_equipment 
WHERE banana_code=0000001
ORDER BY banana_date DESC 
LIMIT 1;
0 голосов
/ 12 февраля 2016

Я только выродок, когда дело доходит до IBM - я парень по SQL Server. Но я обнаружил, что метод округления чисел (который я успешно использовал в Oracle) не работает в DB2. Я использовал это:

SELECT
     MYFIELD 
FROM
     "SCHEMANAME"."TABLENAME" 
WHERE
     FILTERCOL1 = 000001 
     AND FILTERCOL2 = 1 
ORDER BY
     MYFIELD DESC FETCH FIRST ROW ONLY

(Я заказал по убыванию, потому что мне нужно последнее значение.)

Надеюсь, это поможет. Джоуи

...