Ollivander 的库存挑战:在 Mysql 编译器中 row_number() over(partition by ) 中显示语法错误的错误

问题描述 投票:0回答:2
select id,
       age,
       coins_needed,
       power
from(select wands.id as id,
       wands.code as code,
       wands_property.age as age,
       wands.coins_needed as coins_needed,
       wands.power as power,
       wands_property.is_evil as is_evil,
       row_number() over(partition by wands.code,wands.power order by wands.code,wands.power,wands.coins_needed) as rownum
from wands inner join wands_property
on wands.code = wands_property.code
order by wands.code,wands.power) sub
where is_evil = 0 and rownum = 1
order by 4 DESC,2 DESC

我在 hacker rank 中解决了一个挑战,我不得不使用

row_number()
并且在 hacker rank 的 MySQL 编译器中有一个语法错误如下:-

ERROR 1064 (42000) 第 1 行:您的 SQL 语法有错误; 检查对应于您的 MySQL 服务器版本的手册 使用 near '(partition by wands.code,wands.power order 的正确语法 通过 wands.code,wands.power,wands.coins' 在第 11 行

我在 MySQL Workbench 中尝试了同样的查询,令我惊讶的是查询正在运行并且没有显示任何错误。谁能解释一下这里真正的问题是什么。

mysql compiler-errors syntax-error row-number
2个回答
0
投票

ERROR 1064 (42000) 第 1 行:您的 SQL 语法有错误; 检查对应于您的 MySQL 服务器版本的手册 在第 11 行的 '(partition by ....' 附近使用的正确语法

如果你遇到这个错误,那可能是你在旧的 mysql/mariadb 下运行

MySQL/MariaDB 从 8.0 for Mysql 和 10.2 for MariaDB 开始引入了

ROW_NUMBER()
函数和其他窗口函数。


0
投票

导致您收到的错误消息的语法错误与 MySQL 中的 ROW NUMBER() 函数的问题有关。由于 MySQL 本身不支持 ROW NUMBER() 函数,因此如果在查询中使用它,您可能会收到错误消息。这是因为 MySQL 不提供对它的支持。

然而,需要注意的是,许多 MySQL 客户端(例如 MySQL Workbench)通过使用用户定义的变量对其进行模拟来提供对 ROW NUMBER() 函数的支持。这是应该考虑的事情。这使您可以在查询中使用 ROW NUMBER() 函数,尽管 MySQL 本身并不支持它。

根据给出的语法错误,HackerRank 中使用的 MySQL 编译器可能不支持某些 MySQL 客户端提供的模拟 ROW NUMBER() 函数。这可能是因为 HackerRank 和 MySQL Workbench 使用了两个不同版本的 MySQL 或者以两种不同的方式配置了它。

您可以通过使用替代技术(例如子查询或会话变量)模拟 MySQL 中 ROW NUMBER() 函数的行为来避免此问题。您也可以尝试使用不同的 MySQL 客户端来执行查询,看看它是否成功执行而不会产生任何问题。

© www.soinside.com 2019 - 2024. All rights reserved.