明智重蔵です。

MySQL8.0でWindow関数を使ったビューは、
更新(および削除)不可のようですね。
ありがとうございました。

----- 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