ビューでのorder by句の使用

 

MySQLOraclePostgreSQL -> 使用可能

SQL Server -> 使用不可。ただしTOP句がある場合を除く

(8.0.31)

https://dev.mysql.com/doc/refman/8.0/en/create-view.html

ORDER BY is permitted in a view definition, but it is ignored if you select from a view using a statement that has its own ORDER BY.

ビュー内でorder byは使用可能

drop table tab1;
create table tab1(col1 int);

insert into tab1 select floor(rand() * 100)+1;
insert into tab1 select floor(rand() * 100)+1;
insert into tab1 select floor(rand() * 100)+1;
insert into tab1 select floor(rand() * 100)+1;
insert into tab1 select floor(rand() * 100)+1;

select * from tab1;

drop view view1;
create view view1 as select * from tab1 order by col1;
select * from view1;

drop view view1;
create view view1 as select * from tab1 order by col1 desc;
select * from view1;

drop view view1;
create view view1 as select * from tab1;
select * from view1;

 

(19c)

drop table tab1 purge;
create table tab1(col1 int);

insert into tab1 select floor(dbms_random.value(1, 101) ) from dual;
insert into tab1 select floor(dbms_random.value(1, 101) ) from dual;
insert into tab1 select floor(dbms_random.value(1, 101) ) from dual;
insert into tab1 select floor(dbms_random.value(1, 101) ) from dual;
insert into tab1 select floor(dbms_random.value(1, 101) ) from dual;

select * from tab1;
commit;

drop view view1;
create view view1 as select * from tab1 order by col1;
select * from view1;

drop view view1;
create view view1 as select * from tab1 order by col1 desc;
select * from view1;

drop view view1;
create view view1 as select * from tab1;
select * from view1;


ビュー内でorder byを指定すると定義どおりに表示される。
マニュアルにORDER BY句使用可否については特に記載はない模様であるが、

「更新可能なビューであるためには、ORDER BYが含まれていない必要がある」記載
があることから、通常のビューであれば、ORDER BYは使用可能とおもわれる

 

(15)

drop table tab1;
create table tab1(col1 int);

insert into tab1 select floor(random() * 100)+1;
insert into tab1 select floor(random() * 100)+1;
insert into tab1 select floor(random() * 100)+1;
insert into tab1 select floor(random() * 100)+1;
insert into tab1 select floor(random() * 100)+1;

select * from tab1;

drop view view1;
create view view1 as select * from tab1 order by col1;
select * from view1;

drop view view1;
create view view1 as select * from tab1 order by col1 desc;
select * from view1;

drop view view1;
create view view1 as select * from tab1;
select * from view1;


ビュー内でorder byを指定すると定義どおりに表示される。

マニュアルにORDER BY句使用可否については特に記載はない

 

(2019)

https://learn.microsoft.com/ja-jp/sql/t-sql/statements/create-view-transact-sql?view=sql-server-ver15


ビュー定義の SELECT 句に、次を含めることはできません。
ORDER BY 句。ただし、SELECT ステートメントの選択リストに TOP 句が同時に含まれている場合は例外です。


drop table tab1;
create table tab1(col1 int);

insert into tab1 select floor(rand() * 100)+1;
insert into tab1 select floor(rand() * 100)+1;
insert into tab1 select floor(rand() * 100)+1;
insert into tab1 select floor(rand() * 100)+1;
insert into tab1 select floor(rand() * 100)+1;

select * from tab1;

drop view view1;
create view view1 as select * from tab1 order by col1;


メッセージ 1033、レベル 15、状態 1、プロシージャ view1、行 1 [バッチ開始行 1]
TOP、OFFSET、または FOR XML が指定されていない場合、ビュー、インライン関数、派生テーブル、サブクエリ、および共通テーブル式では ORDER BY 句は無効です。


drop view view1;
create view view1 as select top(1) * from tab1 order by col1;
select * from view1;