为什么这个查询不能解析?

a8jjtwal  于 2021-06-21  发布在  Mysql
关注(0)|答案(2)|浏览(384)

关闭。这个问题需要细节或清晰。它目前不接受答案。
**想改进这个问题吗?**通过编辑这个帖子来添加细节并澄清问题。

两年前关门了。
改进这个问题
当我通过mysqlworkbench提交到mysql 5.7社区和mysql 8社区时,这个查询运行得很好。
我的语法来自https://github.com/antlr/grammars-v4/tree/master/mysql.
问题是:

SELECT
    `hr`.`employee`.`FirstName` AS `EmployeeFirstName`
    , `hr`.`employee`.`LastName` AS `EmployeeLastName`
    , `product`.`product`.`Description` AS `ProductDescription`
    , `product`.`unit`.`Unit` AS `Unit`
    , `product`.`product`.`SKU` AS `SKU`
    , `sales`.`transactiondetail`.`Qty` AS `Qty`
    , `product`.`product`.`UnitCost` AS `UnitCost`
    , `product`.`product`.`UnitPrice` AS `UnitPrice`
    , `product`.`manufacturer`.`Manufacturer` AS `Manufacturer`
    , `sales`.`transaction`.`EmployeeNumber` AS `EmployeeNumber`
    , `sales`.`transaction`.`LoyaltyNumber` AS `LoyaltyNumber`
    , `sales`.`transaction`.`StoreNumber` AS `StoreNumber`
    , `store`.`store`.`ZipCode` AS `ZipCode`
    , CAST(
        `sales`.`transaction`.`DateTimeOfTransaction` AS DATE
    ) AS `DateOfTransaction`
    , CAST(
        `sales`.`transaction`.`DateTimeOfTransaction` AS TIME
    ) AS `TimeOfTransaction`
    , CAST(
        CAST(
            `sales`.`transaction`.`DateTimeOfTransaction` AS DATE
        ) AS CHAR CHARSET utf8
    ) AS `DateOfTransactionString`
    , CAST(
        CAST(
            `sales`.`transaction`.`DateTimeOfTransaction` AS TIME
        ) AS CHAR CHARSET utf8
    ) AS `TimeOfTransactionString`
    , WEEKDAY(
        `sales`.`transaction`.`DateTimeOfTransaction`
    ) AS `WeekdayOfTransaction`
    , MONTH(
        `sales`.`transaction`.`DateTimeOfTransaction`
    ) AS `MonthOfTransaction`
    , YEAR(
        `sales`.`transaction`.`DateTimeOfTransaction`
    ) AS `YearOfTransaction`
    , DAYNAME(
        `sales`.`transaction`.`DateTimeOfTransaction`
    ) AS `WeekdayNameOfTransaction`
    , MONTHNAME(
        `sales`.`transaction`.`DateTimeOfTransaction`
    ) AS `MonthNameOfTransaction`
    , `sales`.`transactiondetail`.`TotalPrice` AS `TotalPrice`
FROM
    (
        (
            (
                (
                    (
                        (
                            `sales`.`transaction`
                            JOIN `sales`.`transactiondetail`
                                ON (
                                    (
                                        `sales`.`transaction`.`TransactionID` = `sales`.`transactiondetail`.`TransactionID`
                                    )
                                )
                        )
                        JOIN `hr`.`employee`
                            ON (
                                (
                                    `hr`.`employee`.`EmployeeNumber` = `sales`.`transaction`.`EmployeeNumber`
                                )
                            )
                    )
                    JOIN `product`.`product`
                        ON (
                            (
                                `product`.`product`.`SKU` = `sales`.`transactiondetail`.`SKU`
                            )
                        )
                )
                JOIN `product`.`unit`
                    ON (
                        (
                            `product`.`product`.`UnitID` = `product`.`unit`.`UnitID`
                        )
                    )
            )
            JOIN `store`.`store`
                ON (
                    (
                        `store`.`store`.`StoreNumber` = `sales`.`transaction`.`StoreNumber`
                    )
                )
        )
        JOIN `product`.`manufacturer`
            ON (
                (
                    `product`.`product`.`ManufacturerID` = `product`.`manufacturer`.`ManufacturerID`
                )
            )
    )

以下是antlr4引发的错误:
第1行:874“选择”输入没有可行的替代方案 hr . employee . FirstName 作为 EmployeeFirstName , hr . employee . LastName 作为 EmployeeLastName , product . product . Description 作为 ProductDescription , product . unit . Unit 作为 Unit , product . product . SKU 作为 SKU , sales . transactiondetail . Qty 作为 Qty , product . product . UnitCost 作为 UnitCost , product . product . UnitPrice 作为 UnitPrice , product . manufacturer . Manufacturer 作为 Manufacturer , sales . transaction . EmployeeNumber 作为 EmployeeNumber , sales . transaction . LoyaltyNumber 作为 LoyaltyNumber , sales . transaction . StoreNumber 作为 StoreNumber , store . store . ZipCode 作为 ZipCode ,铸造( sales . transaction . DateTimeOfTransaction 日期) DateOfTransaction ,铸造( sales . transaction . DateTimeOfTransaction 作为时间)作为 TimeOfTransaction ,铸造( sales . transaction . DateTimeOfTransaction 作为日期)作为字符集'

xa9qqrwz

xa9qqrwz1#

你写的

CAST ( ... AS CHAR CHARSET utf8 )

但是根据您使用的语法,应该编写字符集的规范

CAST ( ... AS CHAR CHARACTER SET utf8 )

显然,mysql接受 CHARSET 作为的缩写 CHARACTER SET ,因此语法对于mysql是不正确的。
导致错误的生产线是1968:

dataType
    : typeName=(
      CHAR | VARCHAR | TINYTEXT | TEXT | MEDIUMTEXT | LONGTEXT
      )
      lengthOneDimension? BINARY?
      (CHARACTER SET charsetName)? (COLLATE collationName)?        #stringDataType

因为提供的lexer可以识别关键字 CHARSET ,您可以通过更改 CHARACTER SET(CHARACTER SET | CHARSET) ,但您可能希望搜索 CHARACTER SET 同时也要改变它们(例如,在 #collectionDataType 再往前走20行)大约有十几种 CHARACTER SET 在语法上;他们中的一些人接受 CHARSET 作为别名(如第1636行),但大多数没有。

yqyhoc1h

yqyhoc1h2#

查询完全可以。语法有问题。相反,使用直接来自mysql/oracle的语法作为mysql工作台的一部分。它与一个基类一起工作,该基类提供了一些c++代码来确保某些 predicate 工作,但是如果需要,您应该可以很容易地将其更新到其他目标语言。
链接语法还允许使用特定的服务器版本来禁用/启用在版本之间更改的某些语言部分。它是您将发现的最完整的语法,并且直接从原始(和最新)的mysql yacc语法派生而来(对antlr4进行了优化)。

相关问题