Home > データベース > 【SQLServer】OracleのROWNUMを実装する(SQLServer2000以前)

【SQLServer】OracleのROWNUMを実装する(SQLServer2000以前)

SQLServer2000のときは、現在のレコードより前に来るべき行の COUNT(*)+1 を取ることで、ROWNUMの代わりとすることができますが、ソートキーが複数のときは、少し面倒くさいので例にしてみます。
テスト用データベースは、Northwindを使用しています。
SQLそのものは基本的な構文だけで書けますので、Oracle、PostgreSQL、MySQL、DB2などでも同様に実装できると思います。(文字列変換等は変えないとダメだけど)


1.ソートキー毎に合算していく

SELECT 
    (
    SELECT 
        COUNT(*) 
    FROM 
        "Order Details Extended" A 
    WHERE 
        A.OrderID < B.OrderID 
    ) + 
    (
    SELECT 
        COUNT(*) 
    FROM 
        "Order Details Extended" A 
    WHERE 
        A.OrderID = B.OrderID 
        AND A.ProductID < B.ProductID 
    ) + 1 AS ROWNUM, 
    B.* 
FROM 
    "Order Details Extended" B 
ORDER BY 
    B.OrderID, 
    B.ProductID
;

フィールド数が多くなるほどサブクエリが増えるので、面倒くさくなります。
これを応用すると、あるグループごとに連番を振ることも可能ですね。

SELECT 
    (
    SELECT 
        COUNT(*) + 1 
    FROM 
        "Order Details Extended" A 
    WHERE 
        A.OrderID = B.OrderID 
        AND A.ProductID < B.ProductID 
    ) AS GROUP_NUM, 
    B.* 
FROM 
    "Order Details Extended" B 
ORDER BY 
    B.OrderID, 
    B.ProductID
;


2.文字列として結合し、1つのフィールド扱いにする

SELECT 
    (
    SELECT 
        COUNT(*) + 1 
    FROM 
        "Order Details Extended" A 
    WHERE 
        RIGHT('00000' + CONVERT(VARCHAR, A.OrderID), 5) + RIGHT('000' + CONVERT(VARCHAR, A.ProductID), 3) < RIGHT('00000' + CONVERT(VARCHAR, B.OrderID), 5) + RIGHT('000' + CONVERT(VARCHAR, B.ProductID), 3) 
    ) AS ROWNUM, 
    B.* 
FROM 
    "Order Details Extended" B 
ORDER BY 
    B.OrderID, 
    B.ProductID
;

Int型なので、一旦文字列にしています。もちろん、元々文字列ならそのまま足せるので、ラクチンです。
Int型でも、A.OrderID * 1000 + A.ProductID のように、桁を揃えてしまう手もありますが、IntとCharが混在していることもありますので、上記のような例にしてあります。

Comments:0

Comment Form

Trackbacks:0

TrackBack URL for this entry
http://magicbox.sakura.ne.jp/mt/mt-tb.cgi/561
Listed below are links to weblogs that reference
【SQLServer】OracleのROWNUMを実装する(SQLServer2000以前) from 爆裂!C#野郎

Home > データベース > 【SQLServer】OracleのROWNUMを実装する(SQLServer2000以前)

Search
Feeds
Tag Cloud
Recommend

SQLパズル 第2版 プログラミングが変わる書き方/考え方
SQLパズル 第2版 プログラミングが変わる書き方/考え方

ソフトウェアアーキテクチャ―ソフトウェア開発のためのパターン体系
ソフトウェアアーキテクチャ―ソフトウェア開発のためのパターン体系

ITアーキテクト vol.1
ITアーキテクト vol.1

オブジェクト指向における再利用のためのデザインパターン
オブジェクト指向における再利用のためのデザインパターン

増補改訂版 Java言語で学ぶデザインパターン入門
増補改訂版 Java言語で学ぶデザインパターン入門

増補改訂版 Java言語で学ぶデザインパターン入門 マルチスレッド編
増補改訂版 Java言語で学ぶデザインパターン入門 マルチスレッド編

J2EEデザインパターン
J2EEデザインパターン

アンチパターン―ソフトウェア危篤患者の救出
アンチパターン―ソフトウェア危篤患者の救出

世界でいちばん簡単なネットワークのe本―ネットワークとTCP/IPの基本と考え方がわかる本
世界でいちばん簡単なネットワークのe本―ネットワークとTCP/IPの基本と考え方がわかる本

Return to page top