关闭。这个问题需要细节或清晰。它目前不接受答案。
**想改进这个问题吗?**通过编辑这个帖子来添加细节并澄清问题。
两年前关门了。
改进这个问题
当我通过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
作为日期)作为字符集'
2条答案
按热度按时间xa9qqrwz1#
你写的
但是根据您使用的语法,应该编写字符集的规范
显然,mysql接受
CHARSET
作为的缩写CHARACTER SET
,因此语法对于mysql是不正确的。导致错误的生产线是1968:
因为提供的lexer可以识别关键字
CHARSET
,您可以通过更改CHARACTER SET
至(CHARACTER SET | CHARSET)
,但您可能希望搜索CHARACTER SET
同时也要改变它们(例如,在#collectionDataType
再往前走20行)大约有十几种CHARACTER SET
在语法上;他们中的一些人接受CHARSET
作为别名(如第1636行),但大多数没有。yqyhoc1h2#
查询完全可以。语法有问题。相反,使用直接来自mysql/oracle的语法作为mysql工作台的一部分。它与一个基类一起工作,该基类提供了一些c++代码来确保某些 predicate 工作,但是如果需要,您应该可以很容易地将其更新到其他目标语言。
链接语法还允许使用特定的服务器版本来禁用/启用在版本之间更改的某些语言部分。它是您将发现的最完整的语法,并且直接从原始(和最新)的mysql yacc语法派生而来(对antlr4进行了优化)。