- 2008年3月14日 00:00
- データベース
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
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#野郎