Select 'N' lines (SQL) for DB2 PDF Print E-mail
User Rating: / 0
PoorBest 
Sunday, 18 May 2008

1. Background
In some RDBMS such as MySQL, to select a limited number of 'records', you can use an internal function' LIMIT () ', but this function is a kind of internal Trigger the RDBMS.
The Trigger adds a column to each table that you create, this column will be numbered in order to be able to make some sort.
This solution is a choice that very few RDBMS put in place.
1.1. Working Environment
For examples of this article, we will use the table 'EMPLOYEE', provided with the basis SAMPLE DB2. See code
2. First Fetch n Rows Only
2.1. Query base
Typically in DB2, to make a 'SELECT', we would like this

SELECT * FROM GG.EMPLOYEE

Or

SELECT EMPL.FIRSTNME, EMPL.LASTNAME
AS FROM GG.EMPLOYEE EMPL

This will return the whole of the table.
2.2. Select 10 lines
To recover the first 10 lines of your application, you must use the SQL Fetch First n Rows Only

SELECT EMPL.EMPNO, EMPL.FIRSTNME, EMPL.LASTNAME
AS FROM GG.EMPLOYEE EMPL
BY ORDER EMPL.EMPNO
FETCH FIRST 10 ROWS ONLY


To recover the last 10 lines, we must add an ORDER BY DESC

SELECT EMPL.EMPNO, EMPL.FIRSTNME, EMPL.LASTNAME
AS FROM GG.EMPLOYEE EMPL
BY ORDER EMPL.EMPNO DESC
FETCH FIRST 10 ROWS ONLY


3. Select a beach lines
Here, in order to select a range of lines, for example between 12 and 18 frontlines, it is necessary to call a SQL command, which will add a column to your query.
3.1. OVER ROW_NUMBER ()
The function OVER ROW_NUMBER (), will allow us to make this work.

SELECT ROW_NUMBER () OVER (ORDER BY EMPL.EMPNO) AS NUM, EMPL.EMPNO, EMPL.FIRSTNME, EMPL.LASTNAME
AS FROM GG.EMPLOYEE EMPL

Specifically here, we added a column NUM, which is a 'integer', starting from 1 to N.

To use this column, we need to encapsulate this request, in order to make treatment.

WITH TABLETMP (NUM, EMPNO, FIRST, NOM) AS
(
SELECT ROW_NUMBER () OVER (ORDER BY EMPL.EMPNO) AS NUM, EMPL.EMPNO, EMPL.FIRSTNME, EMPL.LASTNAME
AS FROM GG.EMPLOYEE EMPL
)
SELECT * FROM TABLETMP
WHERE NUM BETWEEN 12 AND 18

We have just returned from 7 lines of the line 12 to line 18.
The clause in OVER BY ORDER (), we guarantee the order of information.


To get the lines from the end, it launches a ORDER BY ........ DESC.

WITH TABLETMP (NUM, EMPNO, FIRST, NOM) AS
(
SELECT ROW_NUMBER () OVER (ORDER BY EMPL.EMPNO DESC) AS NUM, EMPL.EMPNO, EMPL.FIRSTNME, EMPL.LASTNAME
AS FROM GG.EMPLOYEE EMPL
)
SELECT * FROM TABLETMP
WHERE NUM BETWEEN 12 AND 18


4. Let us go further ........
We might need to repeat this kind of select in a draft could then make a stored procedure, instead of your programming language.

CREATE PROCEDURE "GG". "PROCEDURE1"
   (IN VMIN INT, IN VMAX INTEGER)
     DYNAMIC RESULT SETS 1
     LANGUAGE SQL
BEGIN
   
     Rs DECLARE CURSOR WITH RETURN FOR
         AS WITH TABLETMP
         (
             SELECT ROW_NUMBER () OVER (ORDER BY EMPL.EMPNO) AS NUM, EMPL.FIRSTNME, EMPL.LASTNAME
             AS FROM GG.EMPLOYEE EMPL
           
           
         )
         SELECT * FROM TABLETMP
         WHERE AND NUM BETWEEN VMIN VMAX
        
     OPEN rs;
END @

Then we call the procedure in passing two parameters, leaving the beach and the end.

CALL GG.PROCEDURE1 (10.12)

4.1. The total
And here is a stored procedure, which takes over as setting the table for research and the field that make the ORDER BY.

CREATE PROCEDURE "GG". "Procedural"
(IN VTABLE VARCHAR (255),
IN VORDERBY VARCHAR (255),
IN VMIN INT,
IN VMAX INTEGER
)
     DYNAMIC RESULT SETS 1
     LANGUAGE SQL
BEGIN

DECLARE STMT_STRING VARCHAR (500);
RC DECLARE CURSOR WITH RETURN FOR STMT_NAME;

SET STMT_STRING = '
         AS WITH TABLETMP
         (
             SELECT '| | VTABLE ||'.*, ROW_NUMBER () OVER (ORDER BY' | | VORDERBY | | ') AS NUM
             FROM '| | VTABLE | |'
         )
         SELECT * FROM TABLETMP
         WHERE NUM BETWEEN '| | CHAR (VMIN) | |' AND '| | CHAR (VMAX) | |'';

PREPARE STMT_NAME FROM STMT_STRING;
OPEN RC;
        
END @

In this procedure, we go 4 arguments in the CALL.
String: The name of the table
String: The name of the field
Integer: The departure of research
Integer: The End of research

CALL GG.PROCEDURE ( 'GG.EMPLOYEE', 'EMPNO', 15.24)

4.2. Let's be crazy
It could further support this procedure and add an array of 'CHAMP' to select, but I think we would have so easy in this case, write the request for SQL.
5. Perfomances
In this type of complaint, the problem arises in performance as a 'Limit', is relatively heavy in terms of resources.
Obviously, if we have 150 records, it will go very quickly, if we 1,500,000, is something else.
5.1. Cause
In seeking to improve the speed and following a few Explain, one of the reasons is the Order By

ROW_NUMBER () OVER (ORDER BY EMPL.EMPNO DESC)

We could not save Order By clause, but then in this case, we can not guarantee order data between two applications.
One solution that I advocate, and that when analysing the needs of the db, it identifies the tables that we will need to make a 'Limit', and to add a numeric field auto incremented.
In order by the effect will be much faster on a numeric field on a field containing characters for example.
5.2. Other tracks
Another solution is to have a system of persistence, as java for example, and therefore use Cursor Scrollable, you find a pdf you explain very clearly the process
Conclusion
The objective of this article was to answer a question that comes up at my workplace is the result of some of the research that I conducted on the Net.
There may be other ways of doing things, including measures to improve the speed of execution (via the index for example). This requires deepening since there is a request, in my all-around event. :)
6. Acknowledgments
Thanks to Jab, for his advice and tracks:).
Grand thank you also to Emmanuelle, and she knows why:)
Annex
Table 'EMPLOYEE'

CREATE TABLE GG.EMPLOYEE (
EMPNO CHARACTER (6) NOT NULL,
FIRSTNME VARCHAR (12) NOT NULL,
MIDINIT CHARACTER (1) NOT NULL,
LASTNAME VARCHAR (15) NOT NULL,
WORKDEPT CHARACTER (3),
PHONENO CHARACTER (4),
HIREDATE DATE
JOB CHARACTER (8),
EDLEVEL SMALLINT NOT NULL,
SEX CHARACTER (1),
BIRTHDATE DATE
SALARY DECIMAL (9.2),
BONUS DECIMAL (9.2),
COMM DECIMAL (9.2)
)
/
INSERT INTO GG.EMPLOYEE (EMPNO, FIRSTNME, MIDINIT, LASTNAME, WORKDEPT, PHONENO, HIREDATE, JOB, EDLEVEL, SEX, BIRTHDATE, SALARY, BONUS, COMM)
   VALUES ('000010 ',' CHRISTINE ',' I ',' HAAS ',' A00 ','3978','1965-01-01 ',' PRES ', 18,' F ','1933-08-24 ', 52750.00, 1000.00, 4220.00)
/
INSERT INTO GG.EMPLOYEE (EMPNO, FIRSTNME, MIDINIT, LASTNAME, WORKDEPT, PHONENO, HIREDATE, JOB, EDLEVEL, SEX, BIRTHDATE, SALARY, BONUS, COMM)
   VALUES ('000020 ',' MICHAEL ',' L ',' THOMPSON ',' B01 ','3476','1973-10-10 ',' MANAGER ', 18,' M ','1948-02-02 ', 41250.00, 800.00, 3300.00)
/
INSERT INTO GG.EMPLOYEE (EMPNO, FIRSTNME, MIDINIT, LASTNAME, WORKDEPT, PHONENO, HIREDATE, JOB, EDLEVEL, SEX, BIRTHDATE, SALARY, BONUS, COMM)
   VALUES ('000030 ',' SALLY ',' A ',' KWAN ',' C01 ','4738','1975-04-05 ',' MANAGER ', 20,' F ','1941-05-11 ', 38250.00, 800.00, 3060.00)
/
INSERT INTO GG.EMPLOYEE (EMPNO, FIRSTNME, MIDINIT, LASTNAME, WORKDEPT, PHONENO, HIREDATE, JOB, EDLEVEL, SEX, BIRTHDATE, SALARY, BONUS, COMM)
   VALUES ('000050 ',' JOHN ',' B ',' GEYER ',' E01 ','6789','1949-08-17 ',' MANAGER ', 16,' M ','1925-09-15 ', 40175.00, 800.00, 3214.00)
/
INSERT INTO GG.EMPLOYEE (EMPNO, FIRSTNME, MIDINIT, LASTNAME, WORKDEPT, PHONENO, HIREDATE, JOB, EDLEVEL, SEX, BIRTHDATE, SALARY, BONUS, COMM)
   VALUES ('000060 ',' IRVING ',' F ',' STERN ',' D11 ','6423','1973-09-14 ',' MANAGER ', 16,' M ','1945-07-07 ', 32250.00, 500.00, 2580.00)
/
INSERT INTO GG.EMPLOYEE (EMPNO, FIRSTNME, MIDINIT, LASTNAME, WORKDEPT, PHONENO, HIREDATE, JOB, EDLEVEL, SEX, BIRTHDATE, SALARY, BONUS, COMM)
   VALUES ('000070 ',' EVA ',' D ',' PULASKI ',' D21 ','7831','1980-09-30 ',' MANAGER ', 16,' F ','1953-05-26 ', 36170.00, 700.00, 2893.00)
/
INSERT INTO GG.EMPLOYEE (EMPNO, FIRSTNME, MIDINIT, LASTNAME, WORKDEPT, PHONENO, HIREDATE, JOB, EDLEVEL, SEX, BIRTHDATE, SALARY, BONUS, COMM)
   VALUES ('000090 ',' EILEEN ',' W ',' HENDERSON ',' E11 ','5498','1970-08-15 ',' MANAGER ', 16,' F ','1941-05-15 ', 29750.00, 600.00, 2380.00)
/
INSERT INTO GG.EMPLOYEE (EMPNO, FIRSTNME, MIDINIT, LASTNAME, WORKDEPT, PHONENO, HIREDATE, JOB, EDLEVEL, SEX, BIRTHDATE, SALARY, BONUS, COMM)
   VALUES ('000100 ',' THEODORE ',' Q ',' SPENSER ',' E21 ','0972','1980-06-19 ',' MANAGER ', 14,' M ','1956-12-18 ', 26150.00, 500.00, 2092.00)
/
INSERT INTO GG.EMPLOYEE (EMPNO, FIRSTNME, MIDINIT, LASTNAME, WORKDEPT, PHONENO, HIREDATE, JOB, EDLEVEL, SEX, BIRTHDATE, SALARY, BONUS, COMM)
   VALUES ('000110 ',' VINCENZO ',' G ',' LUCCHESSI ',' A00 ','3490','1958-05-16 ',' SALESREP ', 19,' M ','1929-11-05 ', 46500.00, 900.00, 3720.00)
/
INSERT INTO GG.EMPLOYEE (EMPNO, FIRSTNME, MIDINIT, LASTNAME, WORKDEPT, PHONENO, HIREDATE, JOB, EDLEVEL, SEX, BIRTHDATE, SALARY, BONUS, COMM)
   VALUES ('000120 ',' SEAN ',' ',' O''CONNELL ',' A00 ','2167','1963-12-05 ',' CLERK ', 14,' M ','1942-10 -18 ', 29250.00, 600.00, 2340.00)
/
INSERT INTO GG.EMPLOYEE (EMPNO, FIRSTNME, MIDINIT, LASTNAME, WORKDEPT, PHONENO, HIREDATE, JOB, EDLEVEL, SEX, BIRTHDATE, SALARY, BONUS, COMM)
   VALUES ('000130 ',' DOLORES ',' M ',' QUINTANA ',' C01 ','4578','1971-07-28 ',' ANALYST ', 16,' F ','1925-09-15 ', 23800.00, 500.00, 1904.00)
/
INSERT INTO GG.EMPLOYEE (EMPNO, FIRSTNME, MIDINIT, LASTNAME, WORKDEPT, PHONENO, HIREDATE, JOB, EDLEVEL, SEX, BIRTHDATE, SALARY, BONUS, COMM)
   VALUES ('000140 ',' HEATHER ',' A ',' NICHOLLS ',' C01 ','1793','1976-12-15 ',' ANALYST ', 18,' F ','1946-01-19 ', 28420.00, 600.00, 2274.00)
/
INSERT INTO GG.EMPLOYEE (EMPNO, FIRSTNME, MIDINIT, LASTNAME, WORKDEPT, PHONENO, HIREDATE, JOB, EDLEVEL, SEX, BIRTHDATE, SALARY, BONUS, COMM)
   VALUES ('000150 ',' BRUCE ',' ',' ADAMSON ',' D11 ','4510','1972-02-12 ',' DESIGNER ', 16,' M ','1947-05-17' , 25280.00, 500.00, 2022.00)
/
INSERT INTO GG.EMPLOYEE (EMPNO, FIRSTNME, MIDINIT, LASTNAME, WORKDEPT, PHONENO, HIREDATE, JOB, EDLEVEL, SEX, BIRTHDATE, SALARY, BONUS, COMM)
   VALUES ('000160 ',' ELIZABETH ',' R ',' PIANKA ',' D11 ','3782','1977-10-11 ',' DESIGNER ', 17,' F ','1955-04-12 ', 22250.00, 400.00, 1780.00)
/
INSERT INTO GG.EMPLOYEE (EMPNO, FIRSTNME, MIDINIT, LASTNAME, WORKDEPT, PHONENO, HIREDATE, JOB, EDLEVEL, SEX, BIRTHDATE, SALARY, BONUS, COMM)
   VALUES ('000170 ',' MASATOSHI ',' J ',' YOSHIMURA ',' D11 ','2890','1978-09-15 ',' DESIGNER ', 16,' M ','1951-01-05 ', 24680.00, 500.00, 1974.00)
/
INSERT INTO GG.EMPLOYEE (EMPNO, FIRSTNME, MIDINIT, LASTNAME, WORKDEPT, PHONENO, HIREDATE, JOB, EDLEVEL, SEX, BIRTHDATE, SALARY, BONUS, COMM)
   VALUES ('000180 ',' MARILYN ',' S ',' SCOUTTEN ',' D11 ','1682','1973-07-07 ',' DESIGNER ', 17,' F ','1949-02-21 ', 21340.00, 500.00, 1707.00)
/
INSERT INTO GG.EMPLOYEE (EMPNO, FIRSTNME, MIDINIT, LASTNAME, WORKDEPT, PHONENO, HIREDATE, JOB, EDLEVEL, SEX, BIRTHDATE, SALARY, BONUS, COMM)
   VALUES ('000190 ',' JAMES ',' H ',' WALKER ',' D11 ','2986','1974-07-26 ',' DESIGNER ', 16,' M ','1952-06-25 ', 20450.00, 400.00, 1636.00)
/
INSERT INTO GG.EMPLOYEE (EMPNO, FIRSTNME, MIDINIT, LASTNAME, WORKDEPT, PHONENO, HIREDATE, JOB, EDLEVEL, SEX, BIRTHDATE, SALARY, BONUS, COMM)
   VALUES ('000200 ',' DAVID ',' ',' BROWN ',' D11 ','4501','1966-03-03 ',' DESIGNER ', 16,' M ','1941-05-29' , 27740.00, 600.00, 2217.00)
/
INSERT INTO GG.EMPLOYEE (EMPNO, FIRSTNME, MIDINIT, LASTNAME, WORKDEPT, PHONENO, HIREDATE, JOB, EDLEVEL, SEX, BIRTHDATE, SALARY, BONUS, COMM)
   VALUES ('000210 ',' William ',' T ',' JONES ',' D11 ','0942','1979-04-11 ',' DESIGNER ', 17,' M ','1953-02-23 ', 18270.00, 400.00, 1462.00)
/
INSERT INTO GG.EMPLOYEE (EMPNO, FIRSTNME, MIDINIT, LASTNAME, WORKDEPT, PHONENO, HIREDATE, JOB, EDLEVEL, SEX, BIRTHDATE, SALARY, BONUS, COMM)
   VALUES ('000220 ',' JENNIFER ',' K ',' LUTZ ',' D11 ','0672','1968-08-29 ',' DESIGNER ', 18,' F ','1948-03-19 ', 29840.00, 600.00, 2387.00)
/
INSERT INTO GG.EMPLOYEE (EMPNO, FIRSTNME, MIDINIT, LASTNAME, WORKDEPT, PHONENO, HIREDATE, JOB, EDLEVEL, SEX, BIRTHDATE, SALARY, BONUS, COMM)
   VALUES ('000230 ',' JAMES ',' J ',' JEFFERSON ',' D21 ','2094','1966-11-21 ',' CLERK ', 14,' M ','1935-05-30 ', 22180.00, 400.00, 1774.00)
/
INSERT INTO GG.EMPLOYEE (EMPNO, FIRSTNME, MIDINIT, LASTNAME, WORKDEPT, PHONENO, HIREDATE, JOB, EDLEVEL, SEX, BIRTHDATE, SALARY, BONUS, COMM)
   VALUES ('000240 ',' SALVATORE ',' M ',' MARINO ',' D21 ','3780','1979-12-05 ',' CLERK ', 17,' M ','1954-03-31 ', 28760.00, 600.00, 2301.00)
/
INSERT INTO GG.EMPLOYEE (EMPNO, FIRSTNME, MIDINIT, LASTNAME, WORKDEPT, PHONENO, HIREDATE, JOB, EDLEVEL, SEX, BIRTHDATE, SALARY, BONUS, COMM)
   VALUES ('000250 ',' DANIEL ',' S ',' SMITH ',' D21 ','0961','1969-10-30 ',' CLERK ', 15,' M ','1939-11-12 ', 19180.00, 400.00, 1534.00)
/
INSERT INTO GG.EMPLOYEE (EMPNO, FIRSTNME, MIDINIT, LASTNAME, WORKDEPT, PHONENO, HIREDATE, JOB, EDLEVEL, SEX, BIRTHDATE, SALARY, BONUS, COMM)
   VALUES ('000260 ',' SYBIL ',' P ',' JOHNSON ',' D21 ','8953','1975-09-11 ',' CLERK ', 16,' F ','1936-10-05 ', 17250.00, 300.00, 1380.00)
/
INSERT INTO GG.EMPLOYEE (EMPNO, FIRSTNME, MIDINIT, LASTNAME, WORKDEPT, PHONENO, HIREDATE, JOB, EDLEVEL, SEX, BIRTHDATE, SALARY, BONUS, COMM)
   VALUES ('000270 ',' MARIA ',' L ',' PEREZ ',' D21 ','9001','1980-09-30 ',' CLERK ', 15,' F ','1953-05-26 ', 27380.00, 500.00, 2190.00)
/
INSERT INTO GG.EMPLOYEE (EMPNO, FIRSTNME, MIDINIT, LASTNAME, WORKDEPT, PHONENO, HIREDATE, JOB, EDLEVEL, SEX, BIRTHDATE, SALARY, BONUS, COMM)
   VALUES ('000280 ',' ETHEL ',' R ',' SCHNEIDER ',' E11 ','8997','1967-03-24 ',' OPERATOR ', 17,' F ','1936-03-28 ', 26250.00, 500.00, 2100.00)
/
INSERT INTO GG.EMPLOYEE (EMPNO, FIRSTNME, MIDINIT, LASTNAME, WORKDEPT, PHONENO, HIREDATE, JOB, EDLEVEL, SEX, BIRTHDATE, SALARY, BONUS, COMM)
   VALUES ('000290 ',' JOHN ',' R ',' PARKER ',' E11 ','4502','1980-05-30 ',' OPERATOR ', 12,' M ','1946-07-09 ', 15340.00, 300.00, 1227.00)
/
INSERT INTO GG.EMPLOYEE (EMPNO, FIRSTNME, MIDINIT, LASTNAME, WORKDEPT, PHONENO, HIREDATE, JOB, EDLEVEL, SEX, BIRTHDATE, SALARY, BONUS, COMM)
   VALUES ('000300 ',' PHILIP ',' X ',' SMITH ',' E11 ','2095','1972-06-19 ',' OPERATOR ', 14,' M ','1936-10-27 ', 17750.00, 400.00, 1420.00)
/
INSERT INTO GG.EMPLOYEE (EMPNO, FIRSTNME, MIDINIT, LASTNAME, WORKDEPT, PHONENO, HIREDATE, JOB, EDLEVEL, SEX, BIRTHDATE, SALARY, BONUS, COMM)
   VALUES ('000310 ',' MAUDE ',' F ',' SETRIGHT ',' E11 ','3332','1964-09-12 ',' OPERATOR ', 12,' F ','1931-04-21 ', 15900.00, 300.00, 1272.00)
/
INSERT INTO GG.EMPLOYEE (EMPNO, FIRSTNME, MIDINIT, LASTNAME, WORKDEPT, PHONENO, HIREDATE, JOB, EDLEVEL, SEX, BIRTHDATE, SALARY, BONUS, COMM)
   VALUES ('000320 ',' RAMLAL ',' V ',' MEHTA ',' E21 ','9990','1965-07-07 ',' FIELDREP ', 16,' M ','1932-08-11 ', 19950.00, 400.00, 1596.00)
/
INSERT INTO GG.EMPLOYEE (EMPNO, FIRSTNME, MIDINIT, LASTNAME, WORKDEPT, PHONENO, HIREDATE, JOB, EDLEVEL, SEX, BIRTHDATE, SALARY, BONUS, COMM)
   VALUES ('000330 ',' WING ',' ',' LEE ',' E21 ','2103','1976-02-23 ',' FIELDREP ', 14,' M ','1941-07-18' , 25370.00, 500.00, 2030.00)
/
INSERT INTO GG.EMPLOYEE (EMPNO, FIRSTNME, MIDINIT, LASTNAME, WORKDEPT, PHONENO, HIREDATE, JOB, EDLEVEL, SEX, BIRTHDATE, SALARY, BONUS, COMM)
   VALUES ('000340 ',' JASON ',' R ',' GOUNOT ',' E21 ','5698','1947-05-05 ',' FIELDREP ', 16,' M ','1926-05-17 ', 23840.00, 500.00, 1907.00)
/
 
< Prev
School Joomla Templates and Joomla Tutorials