当前位置:  开发笔记 > 编程语言 > 正文

MySQL"WITH"子句

如何解决《MySQL"WITH"子句》经验,为你挑选了4个好方法。

我正在尝试使用MySQL创建一个带有"WITH"子句的视图

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

但似乎MySQL并不支持这一点.

我认为这是非常标准的,我确信Oracle支持这一点.反正强制MySQL使用"WITH"子句吗?我用MyISAM和innoDB引擎试过了.这两个都不起作用.



1> Bill Karwin..:

更新:MySQL 8.0最终获得了常用表表达式的功能,包括递归CTE.

这是一个宣布它的博客:http://mysqlserverteam.com/mysql-8-0-labs-recursive-common-table-expressions-in-mysql-ctes/

以下是我之前在2008年写的答案.


MySQL不支持使用WITHSQL-99中定义的语法进行查询,也称为公用表表达式.

这是自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确实支持CONNECT BYOracle曾经使用的语法)
http://pic.dhe.ibm.com/infocenter/idshelp/v115/index.jsp?topic=%2Fcom.ibm.sqls.doc%2Fids_sqs_2033. HTM


@BillKarwin:我不相信MySQL会实现*任何*现代DBMS功能(检查约束,窗口函数,表达式索引,部分索引,延迟约束......).
@a_horse_with_no_name,它们似乎在可伸缩性上具有更高的优先级。他们长期致力于使内部结构更具可扩展性,以利用现代硬件。但是我认为他们忽略了SQL功能。

2> Mosty Mostac..:

你可能会对这样的想法感兴趣:

select * from (
    select * from table
) as Subquery



3> Ed Altorfer..:

你有正确的语法:

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

但是,正如其他人所提到的,MySQL不支持此命令.在SQL中添加了WITH:1999; 最新版本的SQL标准是SQL:2008.您可以找到有关支持SQL的数据库的更多信息:1999年维基百科上的各种功能.

传统上,MySQL在支持SQL标准方面略有滞后,而Oracle,SQL Server(最近)和DB2等商业数据库则更加密切关注它们.PostgreSQL通常也符合标准.

你可能想看看MySQL的路线图; 我不完全确定何时可以支持此功能,但它非常适合创建可读的汇总查询.



4> 小智..:

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,但我正在清理任何可能已经开始的混乱.

推荐阅读
云聪京初瑞子_617
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有