----- Original Message -----
From: meiji kimura <meiji.kimura@oracle.com>
To: ml@mysql.gr.jp
Date:
2017/11/4, Sat 13:04
Subject: [mysql 16440] Re: MySQL8.0のwindow関数と他DBとの比較結果
木村明治です。
取り急ぎためしてみました。
(2017/11/04 12:03),
mysql201706mailing@yahoo.co.jp wrote:
> 明智重蔵です。
>
> MySQL8.0のWindow関数を他DBと比較してまして、
> MySQLエキスパートの皆様に御願いがあります。
>
> MySQL8.0が動かせる方がおりましたら、
> 比較3を、試した結果を書いていただけないでしょうか?
>
(同様の比較をされる方に、有用な情報になると思いますので)
8.0.3では以下のようにどちらもエラーになります。
mysql [localhost] {msandbox} (test) >
mysql [localhost] {msandbox} (test) > with UpdView as(
-> select Val,Row_Number() over(order by Val) as NewVal
-> from TestTable)
-> update UpdView set Val = NewVal;
ERROR 1288 (HY000): The target table UpdView of the UPDATE is not updatable
mysql [localhost] {msandbox} (test) >
mysql [localhost] {msandbox} (test) > with DelView as(
-> select Row_Number() over(order by Val) as rn
-> from TestTable)
-> delete from DelView where rn < 3;
ERROR 1146 (42S02): Table 'test.DelView' doesn't exist
>
■■■比較1■■■■■■■■■■■■■■■■■■■■■■■■■■■
> Oracleで可能な、
> Lag,Lead,First_Value,Last_Value,Nth_Valueでのignore nulls
>
>
https://www.slideshare.net/oysteing/common-table-expressions-cte-window-functions-in-mysql-80> の48ページと49ページによると、MySQL8.0では不可
>
> ■■■比較2■■■■■■■■■■■■■■■■■■■■■■■■■■■
> ソートキーが日付型で、Range指定でのInterVal型の使用
>
>
https://www.slideshare.net/oysteing/common-table-expressions-cte-window-functions-in-mysql-80>
の35ページによると、MySQL8.0で可能です
>
> ■■■比較3■■■■■■■■■■■■■■■■■■■■■■■■■■■
> SQLServerで可能な、
> Window関数を使用したインラインビューでのUpdateとDelete
>
> create table TestTable(
> Val int unsigned);
>
> insert into TestTable values
> (1),(3),(5),(10),(20),(30),(40);
>
> with UpdView as(
> select Val,Row_Number() over(order by Val) as NewVal
> from TestTable)
> update UpdView set Val = NewVal;
>
> with DelView as(
> select Row_Number() over(order by Val) as rn
> from TestTable)
> delete from DelView where rn < 3;
>
>
https://www.slideshare.net/oysteing/mysql-80-common-table-expressions-71760102> の5ページに書いてある構文です。
>
>
https://dev.mysql.com/doc/refman/8.0/en/view-updatability.html> にWindow関数を使うと更新(および削除)不可と書いてないので
> 更新(および削除)可能と予想してます。
上記のとおりです。ちなみにFirebird 3.0の場合は、そもそもCTEがselectのみ
の対応なので、当然エラーになります。(token select 以外は×)
create table TestTable(Val int);
insert into TestTable values(1);
insert into TestTable values(3);
insert into TestTable values(5);
insert into TestTable values(10);
insert into TestTable values(20);
insert into TestTable values(30);
insert into TestTable
values(40);
commit;
SQL> with UpdView as(
CON> select Val,Row_Number() over(order by Val) as NewVal
CON> from TestTable)
CON> update UpdView set Val = NewVal;
Statement failed, SQLSTATE = 42000
Dynamic SQL Error
-SQL error code = -104
-Token unknown - line 4, column 1
-update
SQL>
SQL> with DelView as(
CON> select Row_Number() over(order by Val) as rn
CON> from TestTable)
CON> delete from DelView where rn < 3;
Statement failed, SQLSTATE = 42000
Dynamic SQL Error
-SQL error code = -104
-Token unknown - line 4, column 1
-delete