2015-04-10 9 views
9

Ich weiß, die Version ist viel zu alt (Yea Version 4!), Aber ich habe keine andere Wahl.SQL Query Limit für DB2 AS/400 Version 4

Wie kann ich meine Abfrage auf 100 Zeilen beschränken, nur für DB2 AS400?

FETCH FIRST n ROWS ONLY 

und

ROW_NUMBER() 

funktionieren nicht.

Irgendwelche Ideen oder Workaround?

Hier ist ein Beispiel SQL-Abfrage ist (nicht funktioniert):

SELECT POLNOP FROM ZICACPTF.POLHDR FETCH FIRST 10 ROWS ONLY 

Es sagt

[SQL0199] Stichwort erwartet FETCH nicht. Gültige Tokens: FÜR MIT ORDER UNION OPTIMIZE.

+1

Die früheste Referenz, die ich für eine _fetch-first-Klausel_ finde, ist V5R1, ähnlich wie für 'ROW_NUMBER()'. Können Sie ein Beispiel geben, wie ** Sie ** es benutzen möchten? Eine FETCH-Anweisung kann einen Block von beispielsweise 100 Reihen holen. Sie könnten einmal FETCH und nur diese Zeilen verarbeiten, aber das impliziert Embedded SQL. Außerdem gab es fünf separate Releases von "Version 4" - welche ist deine? – user2338816

+0

V4R4, was ich nur was eine Tabelle zu holen ist aber nur für zB 10 Zeilen begrenzt. in mysql ist es wie 'wählen * von table1 limit 10' – Kevin

+1

Laufen Sie eine MySQL-Version von 2001? Das ist (scheinbar), als die _fetch-first-Klausel_ in DB2 auf iSeries auftauchte, daher sollte ein ähnlicher Vergleich für MySQL durchgeführt werden. Mit V4R4, das jetzt mehr als 15 Jahre alt ist, kann nicht viel getan werden. IMO, die einzige vernünftige Möglichkeit ist durch Embedded SQL, wo Sie die ersten 10 Zeilen abholen. Ich kann die Anforderungen für SQL-gespeicherte Prozeduren auf V4R4 nicht abrufen. Sie könnten eine erstellen, die eine Ergebnismenge zurückgibt, die nur 10 Zeilen enthält. Wenn ein gespeicherter SQL-Prozess nicht sinnvoll ist, könnte ein externer gespeicherter Prozess verwendet werden. – user2338816

Antwort

2

Es gibt keine dbms-Unterstützung für diese Operation, überprüfen Sie Version 4 DB2 UDB for AS/400 SQL Reference: Nein Limit, Top, First, ... reservierte Worte.

Sie können versuchen, Zeilen über Where-Klausel, where sequence between 100 and 200 zu begrenzen. Aber das ist ein unwirkliches Szenario.

Erste Arbeit ist um über Cursor:

DECLARE ITERROWS INTEGER; 
... 
SET ITERROWS = 0; 
DO WHILE (SUBSTR(SQLSTATE,1,2) = '00' and ITERROWS < 100 
DO 
    ... 
    SET ITERROWS = ITERROWS + 1; 

zweite, in Ihrer Middleware Sprache.

Ich hoffe, dass jemand einen cleveren Workaround post, aber, meiner Meinung nach, sind sie nicht.

+0

Danke, es scheint, dass es wirklich keine Möglichkeit gibt, LIMIT wie Klausel für V4R4 zu verwenden. Leider verwende ich Java + Hibernate, und wir ändern (noch) nichts in AS400 – Kevin

+0

Hibernate ist nicht in der Lage, mit Ihrem Problem durch [Query.setMaxResults()] (http://stackoverflow.com/a/) umzugehen 1239745)? (Disclaimer, nicht getestet) – danihp

+0

ja, es verwendet V5, FETCH FIRST [n] ROWS ONLY Klausel – Kevin

0

Lösung nur für> V4R4

FETCH FIRST [n] ROWS ONLY Verwendung:

SELECT LASTNAME, FIRSTNAME, EMPNO, SALARY 
    FROM EMP 
    ORDER BY SALARY DESC 
    FETCH FIRST 10 ROWS ONLY; 

Referenz: publib.boulder.ibm.com

Der Unterschied, den ich aus der Abfrage zu diesem Beispiel sehen kann, ist, dass wir hier sind Verwenden Sie eine ORDER BY Klausel - haben Sie die Möglichkeit, eine ORDER BY hinzufügen - es sollte Mache den Trick. Referenzierung auf: https://stackoverflow.com/a/16858430/1581725


Um Bereiche oder auch nur die ersten 10 Zeilen zu erhalten, müssten Sie ROW_NUMBER() (seit V5R4) verwenden:

SELECT 
    * 
FROM (
    SELECT ROW_NUMBER() OVER (ORDER BY {{table field}}) AS ROWNUM, * {{yourtable}} 
) AS {{yourcursor}} 
WHERE 
    {{yourcursor}}.ROWNUM>0 AND 
    {{yourcursor}}.ROWNUM<=10 

Referenz: blog.zanclus.com

+0

das funktioniert nicht in V4R4 :) – Kevin

+1

Hatte nur eine v5r4 - wollte dich nicht ohne Lösung fertig machen. Ich werde das in der ersten Zeile hinzufügen - vielleicht braucht jemand das für spätere Versionen. Vielen Dank für Ihr Feedback @Kevin – DominikAngerer