MySQL“WITH”子句
我试图使用MySQL创build一个“WITH”子句的视图
WITH authorRating(aname, rating) AS SELECT aname, AVG(quantity) FROM book GROUP BY aname
但似乎并不像MySQL支持这一点。
我认为这是非常标准的,我相信Oracle支持这一点。 有没有办法强制MySQL使用“WITH”子句? 我已经使用MyISAM和innoDB引擎进行了尝试。 这两个都不起作用。
更新:MySQL 8.0终于得到了公共表expression式的function,包括recursionCTE。
这是一个博客宣布它: 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的function要求: http : //bugs.mysql.com/bug.php?id=16244
其他支持公用表expression式的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及更高版本(支持recursion查询的第一个开源DBMS): http : //www.firebirdsql.org/file/documentation/release_notes/html/rlsnotes210.html#rnfb210-cte
- H2数据库(但只能recursion):
http://www.h2database.com/html/advanced.html#recursive_queries
其他缺乏WITH条款支持的数据库(截至2014年2月):
- Informix(尽pipeInformix确实支持曾经由Oracle使用的
CONNECT BY
语法)
http://pic.dhe.ibm.com/infocenter/idshelp/v115/index.jsp?topic=%2Fcom.ibm.sqls.doc%2Fids_sqs_2033.htm
你有正确的语法:
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。 您可以在维基百科上find更多有关支持SQL:1999的各种function的数据库信息。
MySQL一直在支持SQL标准方面落后了一些,而像Oracle,SQL Server(最近)和DB2这样的商业数据库更紧密地跟随着它们。 PostgreSQL也符合标准。
你可能想看看MySQL的路线图; 我不完全确定什么时候可以支持这个function,但是创build可读的汇总查询是非常好的。
你可能会对这样的事情感兴趣:
select * from ( select * from table ) as Subquery
Oracle支持WITH。
看起来像这样
WITH emps as (SELECT * FROM Employees) SELECT * FROM emps WHERE ID < 20 UNION ALL SELECT * FROM emps where Sex = 'F'
@ysth WITH很难谷歌,因为这是一个普遍的词通常排除在search之外。
你会想看看SELECT文档 ,看看子查询保理如何工作。
我知道这不回答OP,但我正在清理任何可能已经开始的混乱。
你有没有尝试临时表? 这解决了我的问题:
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中使用这个表格:
select * from abc inner join users on ...;
取值select通常必须在括号内。
更新:不知道你正在尝试使用什么语法。 你能展示一个更完整的陈述吗? CREATE VIEW需要一个SELECT语句,afaik可以有一个WITH,但是只有在独立的SELECT中有效。
更新2:错误,我正在考虑CASE,而不是。 谷歌search不会显示任何特殊的WITH语法,除了MySQL也支持的WITH CHECK OPTION。 请首先描述你想达到什么目的?
更新3:只是猜测,你的意思是这样的:
select…从foo,(selectaname平均(数量)作为评级从书籍组aname)作为authorRating其中…
基于@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
您可能希望使用具有macrosfunction的文本编辑器将值列表转换为带引号的select union子句。
MariaDB现在支持WITH。 MySQL现在不是。 https://mariadb.com/kb/en/mariadb/with/