MySQL"WITH"子句

89 mysql sql common-table-expression

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

WITH authorRating(aname, rating) AS
   SELECT aname, AVG(quantity)
   FROM book
   GROUP BY aname
Run Code Online (Sandbox Code Playgroud)

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

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

Bil*_*win 96

更新: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产品:

其他缺乏对WITH子句支持的数据库(截至2014年2月):

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

Mos*_*cho 15

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

select * from (
    select * from table
) as Subquery
Run Code Online (Sandbox Code Playgroud)


Ed *_*fer 11

你有正确的语法:

WITH AuthorRating(AuthorName, AuthorRating) AS
   SELECT aname         AS AuthorName,
          AVG(quantity) AS AuthorRating
   FROM Book
   GROUP By Book.aname
Run Code Online (Sandbox Code Playgroud)

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

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

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


小智 7

Oracle确实支持WITH.

它看起来像这样.

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

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

您需要查看SELECT文档以了解子查询因子如何工作.

我知道这不会回答OP,但我正在清理任何可能已经开始的混乱.


Reu*_*ben 6

基于@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
Run Code Online (Sandbox Code Playgroud)

您可能需要使用具有宏功能的文本编辑器将值列表转换为带引号的 select union 子句。