【问题标题】:Cannot figure out what's wrong with the syntax of WITH in MySQL无法弄清楚 MySQL 中 WITH 的语法有什么问题
【发布时间】:2022-07-23 07:41:57
【问题描述】:

我自己写的 SQL sn-p 显然与以下 URL 中指定的语法不谋而合:

Introduction to MySQL WITH Clause

WITH (Common Table Expressions)

你能发现给定的 SQL sn-p 有什么问题吗?

顺便说一句,该解决方案已尝试应用于摘自HackerRank - Contest Leaderboard的问题

WITH
MAX_POINT
AS 
(
    SELECT HACKER_ID, CHALLENGE_ID, MAX(SCORE)
    FROM SUBMISSIONS
    GROUP BY HACKER_ID, CHALLENGE_ID
),
HACKER_TOTAL_POINTS
AS
(
    SELECT HACKER_ID, SUM(SCORE) AS TOTAL_POINT
    FROM MAX_POINT
    GROUP BY HACKER_ID
    HAVING SUM(SCORE) > 0
)

SELECT T.HACKER_ID, H.NAME,T.TOTAL_POINT
FROM HACKER_TOTAL_POINTS T
INNER JOIN HACKERS H
ON H.HACKER_ID = T.HACKER_ID
ORDER BY T.TOTAL_POINT DESC, T.HACKER_ID;
ERROR 1064 (42000) at line 5: 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 'MAX_POINT
AS 
(
    SELECT HACKER_ID, CHALLENGE_ID, MAX(SCORE)
    FROM SUBMISSI' at line 2

【问题讨论】:

  • MAX(SCORE) 没有别名,可能应该别名为 score 以便第二个 cte 可以看到它
  • 还有你的mysql版本是多少?您需要 8.0 或更高版本才能使用 cte(我不相信hackerrank)
  • 是的,HackerRank 似乎不支持支持WITH 关键字的 MySQL 版本。
  • 您可以通过SELECT VERSION();进行验证
  • 此支持页面声称他们使用 MySQL 8.0.20:support.hackerrank.com/hc/en-us/articles/… 但我猜他们可能尚未在所有服务器上都支持它。

标签: mysql common-table-expression


【解决方案1】:

如果您正在创建 CTE,那么您正在创建一个带有列名的伪表。

在您的第一个 CTE 中,您没有为 MAX(SCORE) 指定列名(或别名)。第二个 CTE 很好。

改变:-

WITH
MAX_POINT
AS 
(
    SELECT HACKER_ID, CHALLENGE_ID, MAX(SCORE)
    FROM SUBMISSIONS
    GROUP BY HACKER_ID, CHALLENGE_ID
)

WITH
MAX_POINT
AS 
(
    SELECT HACKER_ID, CHALLENGE_ID, MAX(SCORE) AS HIGHSCORE
    FROM SUBMISSIONS
    GROUP BY HACKER_ID, CHALLENGE_ID
)

【讨论】:

  • 是的,这是一个问题,但问题是因为 HackerRank 不支持支持 WITH 关键字的 MySQL 版本。
【解决方案2】:
  1. 乍一看,您的代码中的 WITH 子句看起来是正确的。但是,我没有仔细检查它,所以在这个意义上你不应该依赖我的回答。

  2. 要回答您问题的第二部分,即为什么您会从 HackerRank 收到该错误,我的理解是:HackerRank 的 MySQL 版本不支持 CTE(即 WITH 子句)。如果你跑

SELECT Version();

它打印出 5.7.27 。根据post,MySQL 5.7 不支持 CTE

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-16
    • 2013-11-21
    • 1970-01-01
    • 1970-01-01
    • 2016-05-10
    相关资源
    最近更新 更多