SQL Оператор в CTE возвращает синтаксическую ошибку - PullRequest
0 голосов
/ 01 мая 2020

Я довольно новичок в 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 голосов
/ 01 мая 2020

Ваша проблема, вероятно, myCTE против MyCTE - первая - как определяется CTE, а вторая - как на него ссылаются.

Здесь - это дБ < > Скрипка, которая показывает, что она работает с совпадающими именами и не работает с разницей в регистре. Я отмечаю, что в MariaDB (основанном на MySQL) это не проблема.

Чувствительность к регистру имен таблиц, псевдонимов таблиц и, предположительно, CTE, немного сложна в MySQL. Как объясняется в документации :

Следовательно, чувствительность к регистру базовой операционной системы играет роль в чувствительности к регистру имен баз данных, таблиц и триггеров. Это означает, что такие имена не чувствительны к регистру в Windows, но чувствительны к регистру в большинстве разновидностей Unix.

Исходя из языка , описывающего CTE, вполне возможно, что они хранятся в каком-то временном месте некоторого вида:

Общая таблица выражение (CTE) - это именованный временный набор результатов, который существует в области действия одного оператора и на который можно ссылаться позже в этом операторе, возможно, несколько раз.

И из-за использования базовой операционной системы они могут иногда быть чувствительными к регистру.

Примечание: я почти уверен, что это относится к CTE. Позже в документации указано, что псевдонимы таблиц иногда чувствительны к регистру:

По умолчанию псевдонимы таблиц чувствительны к регистру Unix, но не Windows или macOS. Следующий оператор не будет работать с Unix, поскольку он ссылается на псевдоним как a и как A:

mysql> SELECT col_name FROM tbl_name AS WHERE a.col_name = 1 ИЛИ A.col_name = 2;

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...