■ はじめに
SQL文で、ページングを考える
目次
【1】ページング 1)実務的視点 2)技術的視点 【2】ROW_NUMBER 1)構文 2)補足:ROW_NUMBER + PARTITION BY 【3】サンプル 補足:使用しているテーブルについて
【1】ページング
1)実務的視点
* ORDER BY句を使用するので、パフォーマンスが心配 * しかし、データ量が多い時は、I/O的にも有効なので、 システムを考慮して適用した方がいいかも。
2)技術的視点
* Sql Serverには、MySQLやPostgresql にある LIMIT() がない * Sql Server 2005 以降の場合、ROW_NUMBER() で実装する
【2】ROW_NUMBER
* 結果セットにシーケンス番号を振ってくれる関数
1)構文
ROW_NUMBER() OVER(ORDER BY [item1],...)
2)補足:ROW_NUMBER + PARTITION BY
* 以下の関連記事を参照のこと。
https://dk521123.hatenablog.com/entry/2021/03/11/210937
【3】サンプル
-- テーブルについては、後述 SELECT [Id] ,[Name] ,[Address] ,[Email] ,[Age] FROM (SELECT ROW_NUMBER() OVER(ORDER BY [Id]) AS rowNum ,[Id] ,[Name] ,[Address] ,[Email] ,[Age] FROM [Person]) AS SubPerson WHERE SubPerson.rowNum BETWEEN 3 AND 5 ORDER BY SubPerson.[Id]
補足:使用しているテーブルについて
CREATE TABLE [Person]( [Id] [int] IDENTITY(1,1) NOT NULL, [Name] [nvarchar](50) NULL, [Address] [nvarchar](50) NULL, [Email] [nvarchar](50) NULL, [Age] [int] NULL ) ON [PRIMARY]
参考資料
http://pg.4696.info/db/mssql/paging2.html
http://d.hatena.ne.jp/machi_pon/20060706/1152188496
http://www.ipentec.com/document/document.aspx?page=mssql-sql-offset-and-count
http://blog.livedoor.jp/mitten_line/archives/51510381.html
http://japan.internet.com/developer/20060725/25.html
http://msdn.microsoft.com/ja-jp/library/ms186734(v=SQL.105).aspx
関連記事
Window関数 ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2023/02/22/000000
Window関数 ~ ROW_NUMBER / RANK + PARTITION BY ~
https://dk521123.hatenablog.com/entry/2021/03/11/210937
Window関数 ~ LAG / LEAD ~
https://dk521123.hatenablog.com/entry/2021/09/10/092850
Window関数 ~ RANK / DENSE_RANK ~
https://dk521123.hatenablog.com/entry/2012/08/15/225233