「WITH」句を使用してMySQLを使用してビューを作成しようとしています
WITH authorRating(aname, rating) AS
SELECT aname, AVG(quantity)
FROM book
GROUP BY aname
しかし、MySQLがこれをサポートしているようには見えません。
これはかなり標準的なもので、Oracleがこれをサポートしていると確信しています。とにかくMySQLに "WITH"句の使用を強制することはできますか? MyISAMとinnoDBエンジンで試しました。これらは両方とも機能しません。
更新: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月現在):
CONNECT BY
構文をサポートしています)次のようなものに興味があるかもしれません。
select * from (
select * from table
) as Subquery
あなたは正しい構文を持っています:
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のロードマップをご覧ください。この機能がいつサポートされるかは完全にはわかりませんが、読みやすいロールアップクエリを作成するには最適です。
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に答えないことを知っていますが、混乱が始まっているかもしれない混乱を一掃しています。
MariaDBは現在WITHをサポートしています。現在のMySQLはそうではありません。 https://mariadb.com/kb/en/mariadb/with/
@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
マクロ機能を備えたテキストエディタを使用して、値のリストを引用符で囲まれた選択ユニオン句に変換できます。
一時テーブルを試したことはありますか?これは私の教訓を解決しました:
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 ...;
WITH authorRating as (select aname, rating from book)
SELECT aname, AVG(quantity)
FROM authorRating
GROUP BY aname