回答:
更新:MySQL 8.0は、再帰CTEを含む一般的なテーブル式の機能をついに取得します。
これを発表したブログは次のとおりです。http://mysqlserverteam.com/mysql-8-0-labs-recursive-common-table-expressions-in-mysql-ctes/
以下は私の以前の回答で、私が最初に2008年に書いたものです。
MySQL 5.xはWITH
、SQL-99で定義された構文を使用するクエリをサポートしません。これは、共通テーブル式とも呼ばれます。
これは、2006年1月以降のMySQLの機能リクエストでした。http://bugs.mysql.com/bug.php?id = 16244
共通テーブル式をサポートする他のRDBMS製品:
あなたはこのようなsomethinkgに興味があるかもしれません:
select * from (
select * from table
) as Subquery
Subquery
派生テーブル自体に使用した名前です。使用するfrom ( ... )
と、一時テーブル(派生テーブル)のようなものを作成し、名前が必要になります。それが私が使用しas Subquery
た理由です。はい、できますが、外部の派生テーブル(の直前Group By
)に名前を付ける必要があります。お役に立てば幸いです。
あなたは正しい構文を持っています:
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です。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は一般的に検索から除外される一般的な単語であるため、グーグルで検索するのは困難です。
SELECTドキュメントを見て、サブクエリファクタリングがどのように機能するかを確認する必要があります。
これはOPに応答しないことはわかっていますが、混乱が始まった可能性がある場合は、クリーンアップしています。
@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
マクロ機能を備えたテキストエディタを使用して、値のリストを引用符で囲まれたselect union句に変換することができます。
MariaDBはWITHをサポートしています。MySQLは今のところ違います。 https://mariadb.com/kb/en/mariadb/with/
一時テーブルを試したことはありますか?これは私の支配を解決しました:
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 ...;