Table of ContentsPreviousNext

Ispirer             Ispirer


Ispirer SQLWays データベース移行ソフトウェア

Microsoft SQL Server TOP 句を Oracleへ変換

Microsoft SQL Server のTOP 句は SELECT ステートメントで返されるローの数を制限します。 TOP では返されるローの数またはパーセンテージを指定する事ができます。もしTOP句を含む SELECT ステートメントに ORDER BY 句がある場合、返されるローは並べ替え済みの結果セットから選択されます。

Oracle のROWNUM 疑似カラムは結果セットから選択されたローの順番を返します。ROWNUM は Oracle でのローの制限に使用することができますが、ROWNUM は並べ替えが行われる前に割り当てられます。

SQLWays は Microsoft SQL Server のTOP 句を Oracle へ以下のように変換します:

a)TOP 指定の SELECT ステートメントが ORDER BY 句を含まない場合

Microsoft SQL Server で ORDER BY 句が含まれない場合、SQLWays は Oracle の SELECT ステートメントのWHERE句に ROWNUM 疑似カラムを指定することでTOP 句を実装します。

もし TOP に PERCENT 句が指定された場合、SQLWays は、クエリで返されるローの合計数から指定されたパーセンテージに対応するローの数を計算します。

TABLE 36. TOP 指定の SELECT ステートメントが ORDER BY 句を含まない場合
Microsoft SQL Server
Oracle
create procedure sql_sp_select_top
as
DECLARE @a number
select top 1 @a=col1     from tab1 
CREATE OR REPLACE PROCEDURE sql_sp_select_top
AS
v_a VARCHAR2(255);
BEGIN
select col1 INTO v_a from tab1 WHERE ROWNUM <=1;
END; 
create procedure sql_sp_select_top2
as
DECLARE @a number
select top 1 @a=col1     from tab1 WHERE col2>0 
CREATE OR REPLACE PROCEDURE sql_sp_select_top2
AS
v_a VARCHAR2(255);
BEGIN
select col1 INTO v_a from tab1 WHERE col2>0 and ROWNUM <=1;
END; 
create procedure sql_sp_select_top3
as
DECLARE @a number
select top 30 percent @a=col1     from tab1 
CREATE OR REPLACE PROCEDURE sql_sp_select_top3
AS
v_a VARCHAR2(255);
BEGIN
select col1 INTO v_a from tab1 WHERE ROWNUM <=
30 *(SELECT COUNT(*) from tab1) / 100;
END; 

b) TOP 指定のSELECT ステートメントが ORDER BY 句を含む場合

Microsoft SQL Server とは異なり、Oracle では結果セットの並べ替え前に ROWNUM への割り当てを行います。もし Microsoft SQL Server のSELECT ステートメントが ORDER BY 句を含む場合、SQLWays は元のクエリをサブクエリ付きのクエリに変換します。サブクエリで並べ替えを行い、親クエリで ROWNUM によるローの制限をおこないます。

TABLE 37. TOP 指定のSELECT ステートメントが ORDER BY 句を含む場合
Microsoft SQL Server
Oracle
create procedure sql_sp_select_top4
as
DECLARE @a number
select top 1 @a=col1     from tab1 order by col1 
create or replace procedure sql_sp_select_top4
as
a number;
begin
select * into a from (select col1 from tab1 order by col1) where 
rownum<=1;
end; 
create procedure sql_sp_select_top5
as
DECLARE @a number
select top 15 percent @a=col1     from tab1 order by 
col1 
create or replace procedure sql_sp_select_top5
as
a number;
begin
select * into a from (select col1 from tab1 order by col1) where 
rownum<=15*(select count(*) from tab1 order by col1)/100;
end; 


Table of ContentsPreviousNext
Ispirer             Ispirer
Copyright © 1999-2015 Ispirer Systems Ltd. Ispirer and SQLWays are trademarks of Ispirer Systems Ltd. All other product names may be trademarks of the respective companies. All rights reserved.