mysql:16440
From: meiji kimura <meiji kimura <meiji.kimura@xxxxxxxxxx>>
Date: Sat, 04 Nov 2017 13:04:41 +0900
Subject: [mysql 16440] Re: MySQL8.0のwindow関数と他DBとの比較結果
木村明治です。 取り急ぎためしてみました。 (2017/11/04 12:03), mysql201706mailing@xxxxxxxxxx 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
@ 16439 2017-11-04 12:03 [<mysql201706mailing@] MySQL8.0のwindow関数と他DBとの比較結果 -> 16440 2017-11-04 13:04 ┗[meiji kimura <meiji.] @ 16441 2017-11-04 14:35 ┗[<mysql201706mailing@] Re: [mysql 16440] Re: MySQL8.0のwindow関数と他DBとの比較結果 16446 2017-12-04 10:04 ┗[meiji kimura <meiji.] Re: MySQL8.0のwindow関数と他DBとの比較結果