109

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

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

但似乎 MySQL 不支持这一点。

我认为这是非常标准的,我确信 Oracle 支持这一点。无论如何强制MySQL使用“WITH”子句?我已经尝试过使用 MyISAM 和 innoDB 引擎。这两个都不行。

4

8 回答 8

117

更新:MySQL 8.0 终于有了通用表表达式的特性,包括递归 CTE。

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

以下是我早先的答案,最初是我在 2008 年写的。


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

这是自 2006 年 1 月以来对 MySQL 的功能请求:http ://bugs.mysql.com/bug.php?id=16244

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

于 2008-11-28T07:49:26.547 回答
21

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

select * from (
    select * from table
) as Subquery
于 2012-02-11T21:07:24.317 回答
13

您的语法正确:

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

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

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

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

于 2009-05-14T17:07:07.777 回答
10

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

于 2008-11-28T02:15:39.653 回答
4

基于@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

您可能希望使用具有宏功能的文本编辑器将值列表转换为带引号的选择联合子句。

于 2013-10-31T23:44:17.997 回答
2

MariaDB 现在支持 WITH。MySQL 现在不是。 https://mariadb.com/kb/en/mariadb/with/

于 2017-06-11T07:25:54.990 回答
1

你试过临时表吗?这解决了我的问题:

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 ...;
于 2013-02-26T08:53:01.673 回答
1
   WITH authorRating as (select aname, rating from book)
   SELECT aname, AVG(quantity)
   FROM authorRating
   GROUP BY aname
于 2019-06-06T08:48:51.450 回答