109

MySQL を使用して、"WITH" 句を含むビューを作成しようとしています。

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

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

これはかなり標準的だと思いました。Oracle がこれをサポートしていると確信しています。MySQLに「WITH」句の使用を強制する方法はありますか? MyISAM と innoDB エンジンで試してみました。これらはどちらも機能しません。

4

8 に答える 8

117

更新: 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 製品:

于 2008-11-28T07:49:26.547 に答える
21

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

select * from (
    select * from table
) as Subquery
于 2012-02-11T21:07:24.317 に答える
13

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

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 のさまざまな機能をサポートするデータベースの詳細については、Wikipediaを参照してください。

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

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

于 2009-05-14T17:07:07.777 に答える
10

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

このようになります。

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

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

サブクエリのファクタリングがどのように機能するかを確認するには、SELECT ドキュメントを参照してください。

これがOPに答えないことは知っていますが、ysthが始まった可能性のある混乱を片付けています。

于 2008-11-28T02:15:39.653 に答える
4

@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 句に変換することができます。

于 2013-10-31T23:44:17.997 に答える
1

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

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 ...;
于 2013-02-26T08:53:01.673 に答える