CTE中的SQL语句返回语法错误

时间:2020-05-01 09:06:02

标签: mysql sql common-table-expression

我对SQL非常陌生,并尝试构建我的第一个CTE。这是语法:

    WITH myCTE AS
    (
        SELECT
            ProductID,
            MAX(Quantity) As MaxQuant
        FROM
            OrderDetails
        GROUP BY
            ProductID
        HAVING
            MaxQuant > 100
    )
    SELECT
        * 
    FROM MyCTE

    WHERE
        ProductID > 50

如果有帮助,我在w3schools.com的教程数据库上进行了尝试。有什么办法可以得到比这更有用的错误?

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'myCTE AS (SELECT ProductID, MAX(Quantity) As MaxQuant FROM OrderDetails GROUP ' at line 1

https://www.w3schools.com/sql/trymysql.asp?filename=trysql_func_mysql_truncate

1 个答案:

答案 0 :(得分:0)

您的问题可能是myCTEMyCTE -第一个问题是如何定义CTE,第二个问题是如何引用CTE。

Here是一个db <>小提琴,显示了它使用的名称匹配但不区分大小写。我注意到在MariaDB(基于MySQL)中,这不是问题。

在MySQL中,表名,表别名以及CTE的大小写敏感性有些棘手。如documentation中所述:

因此,底层操作系统的区分大小写在数据库,表和触发器名称的区分大小写中起着重要作用。这意味着这些名称在Windows中不区分大小写,但在大多数Unix版本中都区分大小写。

基于language describing CTEs,,它们很有可能存储在某种临时位置中:

公用表表达式(CTE)是一个命名的临时结果集,它存在于单个语句的范围内,以后可以在该语句中引用,可能多次。

由于使用底层操作系统,它们有时可能区分大小写。

注意:我很确定CTE就是这种情况。后来documentation指出表别名有时区分大小写:

默认情况下,表别名在Unix上区分大小写,但在Windows或macOS上不区分大小写。以下语句在Unix上不起作用,因为它将别名同时称为a和A:

mysql>从tbl_name AS中选择​​col_name 其中a.col_name = 1或A.col_name = 2;

相关问题