Answers:
更新:MySQL 8.0终于有了通用表表达式的功能,包括递归CTE。
这是一个宣布它的博客:http : //mysqlserverteam.com/mysql-8-0-labs-recursive-common-table-expressions-in-mysql-ctes/
以下是我最初在2008年写的答案。
MySQL 5.x不支持使用WITH
SQL-99中定义的语法(也称为通用表表达式)进行查询。
自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
)。希望能有所帮助。
您的语法正确:
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的路线图;我不确定何时可以支持此功能,但是对于创建可读的汇总查询非常有用。
Oracle确实支持WITH。
看起来像这样。
WITH emps as (SELECT * FROM Employees)
SELECT * FROM emps WHERE ID < 20
UNION ALL
SELECT * FROM emps where Sex = 'F'
@ysth WITH很难在Google上搜索,因为它是通常不包含在搜索中的常用词。
您需要查看SELECT文档,以了解子查询分解的工作原理。
我知道这不能解决操作问题,但我正在清理可能已经开始的混乱情况。
MariaDB现在支持WITH。MySQL目前还不是。 https://mariadb.com/kb/zh-CN/mariadb/with/
在@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子句。
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 ...;