我正在尝试使用 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 终于有了通用表表达式的特性,包括递归 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
您的语法正确:
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 很难用谷歌搜索,因为它是一个通常被排除在搜索之外的常用词。
您需要查看SELECT 文档以了解子查询分解是如何工作的。
我知道这不能回答 OP,但我正在清理任何可能已经开始的混乱。
基于@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
您可能希望使用具有宏功能的文本编辑器将值列表转换为带引号的选择联合子句。
MariaDB 现在支持 WITH。MySQL 现在不是。 https://mariadb.com/kb/en/mariadb/with/
你试过临时表吗?这解决了我的问题:
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 ...;
WITH authorRating as (select aname, rating from book)
SELECT aname, AVG(quantity)
FROM authorRating
GROUP BY aname