我正在尝试使用MySQL的"WITH"子句创建视图
WITH authorRating(aname, rating) AS
SELECT aname, AVG(quantity)
FROM book
GROUP BY aname
但似乎MySQL不支持这个功能。
我认为这是相当标准的,Oracle肯定支持这个功能。有没有办法强制MySQL使用"WITH"子句?我尝试过MyISAM和InnoDB引擎,但都不行。
我正在尝试使用MySQL的"WITH"子句创建视图
WITH authorRating(aname, rating) AS
SELECT aname, AVG(quantity)
FROM book
GROUP BY aname
但似乎MySQL不支持这个功能。
我认为这是相当标准的,Oracle肯定支持这个功能。有没有办法强制MySQL使用"WITH"子句?我尝试过MyISAM和InnoDB引擎,但都不行。
更新:MySQL 8.0终于获得了使用通用表达式(包括递归CTEs)的功能。
这是一篇宣布此消息的博客: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产品:
你可能会对这个感兴趣:
select * from (
select * from table
) as Subquery
Subquery
是我用来表示派生表本身的名称。当你使用 from ( ... )
时,你创建了类似于临时表(派生表),它需要一个名称。这就是为什么我使用了 as Subquery
。回答你的问题,是的,你可以这样做,但你必须给外部派生表命名(就在 Group By
之前)。希望这有所帮助。 - Mosty Mostacho您已经掌握了正确的语法:
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各种功能的数据库的更多信息。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 的回答,但我正在清理 ysth 可能引起的任何混淆。
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
您可能需要使用带有宏功能的文本编辑器将值列表转换为带引号的选择联合子句。
WITH authorRating as (select aname, rating from book)
SELECT aname, AVG(quantity)
FROM authorRating
GROUP BY aname
你是否尝试过临时表? 这解决了我的问题:
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 ...;