PDA

View Full Version : DB2 Limit



h-net
14-08-07, 13:40
hi...

habe eine db2 datanbank auf einer i5 von ibm

wie kann ich bei einer abfrage ein limit setzen(Die datensätze einer abfrage von x bis y)?
das mit "ROW_NUMBER() OVER(ORDER BY SPALTE) AS ZEILE" funtioniert irgendwie nicht...

ich hoffe ihr könnt mir da weiter helfen?

ps: wie bekomme ich die db2 version heraus?

gruß

B.Hauser
14-08-07, 16:04
Hallo,

1. da auf der AS/400/iSeries/System i die Datenbank im Betriebssystem integriert ist, richtet sich die Datenbanken Version immer nach der Versions-Nr. des Releases, also V5R3 oder V5R4.

2. Die Funktion ROW_NUMBER ist erst ab Release V5R4 verfügbar und kann nur von der SQL query engine ausgeführt werden.

3. Wenn ihr auf Release V5R4 seid, und Du z.B. nur die Zeilen mit der Nummerierung 3 bis 7 haben möchtest, musst Du eine Common Table Expression verwenden etwa so.


With x as (Select a.*,
Rank() Over(Order By Umsatz Desc) as Rang
From UmsMitarb a
Where Jahr = 2007)
Select * from x
where Rang between 3 and 7


Birgitta

h-net
14-08-07, 17:42
also wir sind auf V5R3...

wie mache ich das da?
oder gibt es da keine möglichkeit?


gruß

B.Hauser
14-08-07, 18:24
Hallo,

ich kenne Deine Anforderungen nicht, aber unter V5R3 kannst Du vielleicht den folgenden Workaround verwenden.
Im folgenden Beispiel wird der 8 - 10 Satz zurückgebracht.



With x as (Select *
From Tabelle
Where ....
Order By Spalte
Fetch First 10 Rows only),
y as (Select *
From x
Order By Spalte Desc
Fetch First 3 Rows Only)
Select * from y
Order By Spalte

h-net
15-08-07, 15:36
Erstmal vielen dank für deine hilfe bis jetzt... (DER SQL befehl is genial... da wär ich net so schnell draufgekommen...)

aber leider geht das anscheinend auch nicht...
wenn ich das in strsql eingebe dann:

WITH X as (SELECT * FROM TABELLE)
Y as (SELECT * FROM X)

Token Y ungültig. Gültige Token: ( SELECT.


könnte es noch eine andere möglichket geben?

gruß

Pikachu
15-08-07, 16:19
Setze mal noch ein Komma zwischen ) und y, dann sollte es gehen.

Oder probier's mal so:

SELECT * FROM (
SELECT * FROM (
SELECT * FROM TABELLE WHERE ...
ORDER BY SPALTE FETCH FIRST 10 ROWS ONLY) X
ORDER BY SPALTE DESC FETCH FIRST 3 ROWS ONLY) Y
ORDER BY SPALTE

B.Hauser
15-08-07, 17:27
Sorry,
ich hatte ein Komma vergessen.

Die beiden Common Table Expressions müssen durch ein Komma getrennt werden. (Ich habe es in meinem SQL-Statement oben korrigiert.)

Common Table Expressions gibt es übrigens schon länger als Sub-Selects. CTEs wurden V4R3 eingeführt, während Sub-Selects erst ab Release V5R1 verwendet werden können.

Birgitta