MySQL“ WITH”子句

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

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

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

我认为这是非常标准的,我相信甲骨文支持这一点。是否存在强制 MySQL 使用“ WITH”子句的方法?我已经用 MyISAM 和 inoDB 引擎试过了。这两个都不管用。

259677 次浏览

Oracle 确实支持 WITH。

就像这样。

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

@ ysth WITH 很难用谷歌搜索,因为它是一个通常被排除在搜索之外的常用词。

您需要查看 选择文档来了解子查询分解是如何工作的。

我知道这不能回答观察所的问题,但是我正在清理任何可能已经开始的混乱。

更新: MySQL 8.0终于获得了常见表表达式的特性,包括递归 CTE。

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

下面是我早些时候的回答,我最初是在2008年写的。


MySQL 5.x 不支持使用 SQL-99(也称为 公共表表达式。)中定义的 WITH语法的查询

自2006年1月以来,这一直是 MySQL 的一个特性请求: http://bugs.mysql.com/bug.php?id=16244

支持公共表表达式的其他 RDBMS 产品:

你的语法是对的:

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。您可以在 Wikipedia上找到关于支持 SQL: 1999的各种特性的数据库的更多信息。

传统上,MySQL 在支持 SQL 标准方面有些落后,而 Oracle、 SQL Server (最近)和 DB2等商业数据库则更加紧随其后。PostgreSQL 通常也非常符合标准。

您可能想看看 MySQL 的路线图; 我不完全确定这个特性什么时候会得到支持,但是它非常适合创建可读的卷起查询。

你可能会对这样的东西感兴趣:

select * from (
select * from table
) as Subquery

你试过临时桌吗? This solved my convern:

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 ...;

基于@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 is now supporting WITH. MySQL for now is not. Https://mariadb.com/kb/en/mariadb/with/

   WITH authorRating as (select aname, rating from book)
SELECT aname, AVG(quantity)
FROM authorRating
GROUP BY aname