MySQL的“WITH”子句

我试图用“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产品:

  • Oracle 9i第2版和更高版本:
    http://www.oracle-base.com/articles/misc/with-clause.php
  • Microsoft SQL Server 2005及更高版本:
    http://msdn.microsoft.com/en-us/library/ms190766(v=sql.90).aspx
  • IBM DB2 UDB 8和更高版本:
    http://publib.boulder.ibm.com/infocenter/db2luw/v8/index.jsp?topic=/com.ibm.db2.udb.doc/admin/r0000879.htm
  • PostgreSQL 8.4及更高版本:
    https://www.postgresql.org/docs/current/static/queries-with.html
  • Sybase 11及更高版本:
    http://dcx.sybase.com/1100/en/dbusage_en11/commontblexpr-s-5414852.html
  • SQLite 3.8.3和更高版本:
    http://sqlite.org/lang_with.html
  • HSQLDB:
    http://hsqldb.org/doc/guide/dataaccess-chapt.html#dac_with_clause
  • Firebird 2.1及更高版本(支持递归查询的第一个开源DBMS):http://www.firebirdsql.org/file/documentation/release_notes/html/rlsnotes210.html#rnfb210-cte
  • H2数据库(但只能递归):
    http://www.h2database.com/html/advanced.html#recursive_queries
  • 其他缺乏WITH条款支持的数据库(截至2014年2月):

  • Informix(虽然Informix确实支持Oracle曾经使用过的CONNECT BY语法)
    http://pic.dhe.ibm.com/infocenter/idshelp/v115/index.jsp?topic=%2Fcom.ibm.sqls.doc%2Fids_sqs_2033.htm

  • 你可能会对这样的事情感兴趣:

    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。 您可以在维基百科上找到更多关于支持SQL的数据库的信息:1999年的各种功能。

    传统上,MySQL在支持SQL标准方面落后了一些,而像Oracle,SQL Server(最近)和DB2这样的商业数据库则更加紧密地跟随它们。 PostgreSQL通常也符合标准。

    你可能想看看MySQL的路线图; 我不完全确定何时可以支持此功能,但对于创建可读的汇总查询非常有用。

    链接地址: http://www.djcxy.com/p/30457.html

    上一篇: MySQL "WITH" clause

    下一篇: Custom placeholder inside element <td> not showing