Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Paging i mssql

6 views
Skip to first unread message

Leif Neland

unread,
Dec 18, 2012, 8:23:46 AM12/18/12
to
Skal man i en webside dele noget op i sider, f.ex. 1-10 på 1. side,
10-19 på næste side osv, ville man i mysql bruge
LIMIT $first,$number_per_page

Det findes ikke i mssql; der har jeg fundet ud af dette:

WITH o AS (
SELECT (..felter...),
ROW_NUMBER() OVER (ORDER by (..felt..) ) AS rowno
FROM tabel
)
SELECT *,(SELECT COUNT(*) FROM o) rows
FROM o WHERE rowno BETWEEN $first AND ($first+$number_per_page-1);

Man får i et query også 'rows' så man kan lave sin 'første forrige
næste sidste' navigation uden at skulle genere databasen een gang til.

Jeg formoder at optimizeren er smart nok til at "SELECT COUNT(*) FROM
o" kun bliver beregnet een gang.

Leif

--
Husk kørelys bagpå, hvis din bilfabrikant har taget den idiotiske
beslutning at undlade det.


Martin

unread,
Dec 18, 2012, 12:20:27 PM12/18/12
to
On 18-12-2012 14:23, Leif Neland wrote:
> Skal man i en webside dele noget op i sider, f.ex. 1-10 på 1. side,
> 10-19 på næste side osv, ville man i mysql bruge
> LIMIT $first,$number_per_page
>
> Det findes ikke i mssql; der har jeg fundet ud af dette:
>
> WITH o AS (
> SELECT (..felter...),
> ROW_NUMBER() OVER (ORDER by (..felt..) ) AS rowno
> FROM tabel
> )
> SELECT *,(SELECT COUNT(*) FROM o) rows
> FROM o WHERE rowno BETWEEN $first AND ($first+$number_per_page-1);
>
> Man får i et query også 'rows' så man kan lave sin 'første forrige næste
> sidste' navigation uden at skulle genere databasen een gang til.
>
> Jeg formoder at optimizeren er smart nok til at "SELECT COUNT(*) FROM o"
> kun bliver beregnet een gang.

Jeg fandt følgende hos google

limit X, Y - MySQL

MSSQL version :
select top Y *
from <table>
where <unique id> not in (select top X <unique id> from <table> order by
<unique id>)
from <table> order by <unique id>

Arne Vajhøj

unread,
Dec 18, 2012, 8:39:44 PM12/18/12
to
On 12/18/2012 8:23 AM, Leif Neland wrote:
> Skal man i en webside dele noget op i sider, f.ex. 1-10 på 1. side,
> 10-19 på næste side osv, ville man i mysql bruge
> LIMIT $first,$number_per_page
>
> Det findes ikke i mssql; der har jeg fundet ud af dette:
>
> WITH o AS (
> SELECT (..felter...),
> ROW_NUMBER() OVER (ORDER by (..felt..) ) AS rowno
> FROM tabel
> )
> SELECT *,(SELECT COUNT(*) FROM o) rows
> FROM o WHERE rowno BETWEEN $first AND ($first+$number_per_page-1);
>
> Man får i et query også 'rows' så man kan lave sin 'første forrige næste
> sidste' navigation uden at skulle genere databasen een gang til.
>
> Jeg formoder at optimizeren er smart nok til at "SELECT COUNT(*) FROM o"
> kun bliver beregnet een gang.

Det burde den, men der er jo ingen garanti, hvorfor ikke bare
2 gange SELECT, så er du jo sikker.

Arne


0 new messages