2009. december 15., kedd

Sybase Adaptive Server page-elés

Egyik ügyfelünk Sybase Adaptive Server-t használt. Ha egy adathalmazt page-elve szeretnénk megjeleníteni vagy feldolgozni, akkor ahelyett, hogy a teljes adathalmazt letöltenénk, más SQL szerverekben "gyári" támogatást is kapunk, sőt, a Sybase másik 2 termékében (Sybase SQL Anywhere és Sybase IQ) is van támogatás.

Ha pl. a felhasználó a 6. lapot szeretné látni, és ezért az 50. sortól kezdve 10 sor letöltése szükséges, akkor az így kapható meg:

MySQL:
SELECT * FROM tbl ORDER BY col_1 LIMIT 10,50

Oracle:
SELECT * FROM (SELECT * FROM tbl ORDER BY col_1) WHERE ROWNUM >= 50 and ROWNUM < 60

MS SQL 2005+
SELECT * FROM (SELECT ROW_NUMBER() OVER (ORDER BY col_1) AS RowNum, * FROM tbl) AS MyDerivedTable
WHERE MyDerivedTable.RowNum >= 50 AND MyDerivedTable.RowNum <60

Sybase SQL Anywhere:
SELECT TOP 10 START AT 50 * FROM tbl order by col_1

Sybase IQ:
select * FROM tbl WHERE ROWID(tbl) >= 50 and ROWID(tbl) < 60 ORDER BY col_1

Sybase Adaptive Server: univerzális megoldás sajnos nincs...

1. Ha nem túl nagy a tábla, pl. csak pár száz soros, akkor a fentiekkel azonos funkcionalitású ez a megoldás:

select top 10 * from tbl A where 50 < (select count(*) from tbl X where X.col_1 <= A.col_1) order by col_1

2. Ha a tábla nagy, de nem követelmény, hogy pl. a 6. lapra lehessen ugrani az elsőről, hanem elegendő letöltögetni a részhalmazokat egymás után, akkor valami hasonlót lehet csinálni:

- letöltjük az első 10 sort:
select top 10 * from tbl order by col_1
- a kliens oldalon elmentjük a 10 sor közül az utolsónak az értékét
- letöltjük a következő 10 sort az "utolsó" érték után:
select top 10 from tbl where col_1 > @utolso_ertek order by col_1

Nincsenek megjegyzések:

Megjegyzés küldése