web-dev-qa-db-ja.com

MySQLの「WITH」句

「WITH」句を使用してMySQLを使用してビューを作成しようとしています

WITH authorRating(aname, rating) AS
   SELECT aname, AVG(quantity)
   FROM book
   GROUP BY aname

しかし、MySQLがこれをサポートしているようには見えません。

これはかなり標準的なもので、Oracleがこれをサポートしていると確信しています。とにかくMySQLに "WITH"句の使用を強制することはできますか? MyISAMとinnoDBエンジンで試しました。これらは両方とも機能しません。

85
Bill Collins

更新:MySQL 8.0は、再帰的なCTEを含む一般的なテーブル式の機能をついに入手しています。

これを発表するブログは次のとおりです。 http://mysqlserverteam.com/mysql-8-0-labs-recursive-common-table-expressions-in-mysql-ctes/

以下は、2008年に最初に書いた以前の回答です。


MySQLは、SQL-99で定義されているWITH構文(Common Table Expressionsとも呼ばれる)を使用したクエリをサポートしていません。

これは、2006年1月からMySQLの機能要求でした: http://bugs.mysql.com/bug.php?id=16244

共通のテーブル式をサポートする他のRDBMS製品:

WITH句をサポートしていない他のデータベース(2014年2月現在):

94
Bill Karwin

次のようなものに興味があるかもしれません。

select * from (
    select * from table
) as Subquery
14
Mosty Mostacho

あなたは正しい構文を持っています:

WITH AuthorRating(AuthorName, AuthorRating) AS
   SELECT aname         AS AuthorName,
          AVG(quantity) AS AuthorRating
   FROM Book
   GROUP By Book.aname

ただし、他の人が述べたように、MySQLはこのコマンドをサポートしていません。 WITH:SQL:1999で追加されました。 SQL標準の最新バージョンはSQL:2008です。 Wikipedia でSQL:1999のさまざまな機能をサポートするデータベースに関する詳細情報を見つけることができます。

MySQLは伝統的にSQL標準のサポートに少し遅れをとっていましたが、Oracle、SQL Server(最近)、DB2などの商用データベースはそれらをもう少し厳密に追跡しています。 PostgreSQLも通常、かなり標準に準拠しています。

MySQLのロードマップをご覧ください。この機能がいつサポートされるかは完全にはわかりませんが、読みやすいロールアップクエリを作成するには最適です。

11
Ed Altorfer

OracleはWITHをサポートします。

このようになります。

WITH emps as (SELECT * FROM Employees)
SELECT * FROM emps WHERE ID < 20
UNION ALL
SELECT * FROM emps where Sex = 'F'

@ysth WITHは、通常検索から除外される一般的なWordであるため、Googleで検索するのは困難です。

SELECT docs を見て、サブクエリファクタリングがどのように機能するかを確認してください。

私はこれがOPに答えないことを知っていますが、混乱が始まっているかもしれない混乱を一掃しています。

7
Mark Brady

MariaDBは現在WITHをサポートしています。現在のMySQLはそうではありません。 https://mariadb.com/kb/en/mariadb/with/

2
Moshe L

@Mosty Mostachoからの回答に基づいて、テーブルに存在せず、他のデータベースにないエントリを特定する特定のケースについて、MySQLで同等の操作を行う方法を次に示します。

select col1 from (
   select 'value1' as col1 union
   select 'value2' as col1 union
   select 'value3' as col1
) as subquery
left join mytable as mytable.mycol = col1
where mytable.mycol is null
order by col1

マクロ機能を備えたテキストエディタを使用して、値のリストを引用符で囲まれた選択ユニオン句に変換できます。

2
Reuben

一時テーブルを試したことはありますか?これは私の教訓を解決しました:

create temporary table abc (
column1 varchar(255)
column2 decimal
);
insert into abc
select ...
or otherwise
insert into abc
values ('text', 5.5), ('text2', 0815.8);

次に、このセッションのすべての選択でこのテーブルを使用できます。

select * from abc inner join users on ...;
1
Claus
   WITH authorRating as (select aname, rating from book)
   SELECT aname, AVG(quantity)
   FROM authorRating
   GROUP BY aname
0
Mantas Dainys