Mysql 和 SQL 服务器之间的语法差异
Syntax differences between Mysql and SQL Server
描述:
朱莉娅要求她的学生创造一些编码挑战。编写查询以打印 hacker_id、姓名和每个学生创建的挑战总数。按照挑战总数降序排列您的结果。如果不止一个学生创建了相同数量的挑战,则将结果按 hacker_id 排序。如果不止一名学生创建了相同数量的挑战,并且计数小于创建的最大挑战数量,则将这些学生从结果中排除。
这是我的 SQL 代码:
SELECT
H.HACKER_ID AS 'HACKER_ID', NAME,
COUNT(NAME) AS 'COUNT1'
FROM
HACKERS H
JOIN
CHALLENGES C ON H.HACKER_ID = C.HACKER_ID
GROUP BY
H.HACKER_ID, NAME
HAVING
COUNT1 = (SELECT MAX(S1.COUNT3)
FROM
(SELECT COUNT(HACKER_ID) AS 'COUNT3'
FROM CHALLENGES
GROUP BY HACKER_ID) AS S1)
OR COUNT1 IN (SELECT S2.COUNT2
FROM
(SELECT HACKER_ID, COUNT(HACKER_ID) AS 'COUNT2'
FROM CHALLENGES
GROUP BY HACKER_ID) AS S2
GROUP BY
S2.COUNT2
HAVING
COUNT(S2.COUNT2) = 1)
ORDER BY
COUNT1 DESC, H.HACKER_ID;
问题:
实际上此代码可以 运行 在 Mysql 环境中并得到正确的结果但不能 运行 在 SQL 服务器环境中并且我得到一个错误
Invalid column name 'COUNT1'
我想问一下 SQL 服务器这里的确切错误是什么以及 Mysql 和 SQL 服务器之间的区别是什么,因为这个错误只发生在 SQL 服务器但不在 Mysql
就您的查询而言:SQL 服务器不支持在 HAVING
子句中重复使用 FROM
子句中定义的别名。在这方面,SQL 服务器遵循 SQL 标准,MySQL 确实扩展了该标准。您需要重复表达式,这意味着:将 HAVING
子句中的 COUNT1
替换为 COUNT(NAME)
.
我还强烈建议不要用单引号将标识符(这里是 SELECT
子句中的别名)括起来。这不是标准 SQL,并非所有数据库都支持。只要您的标识符不包含特殊字符,就不需要引用它们。
最后:您的查询看起来比它需要的更复杂。如果您要问另一个问题,并提供一个最小的可重现示例(相关表中的示例数据和预期结果),那么有人可能会提出进一步的优化建议。但这不是你在这里问的问题。
描述:
朱莉娅要求她的学生创造一些编码挑战。编写查询以打印 hacker_id、姓名和每个学生创建的挑战总数。按照挑战总数降序排列您的结果。如果不止一个学生创建了相同数量的挑战,则将结果按 hacker_id 排序。如果不止一名学生创建了相同数量的挑战,并且计数小于创建的最大挑战数量,则将这些学生从结果中排除。
这是我的 SQL 代码:
SELECT
H.HACKER_ID AS 'HACKER_ID', NAME,
COUNT(NAME) AS 'COUNT1'
FROM
HACKERS H
JOIN
CHALLENGES C ON H.HACKER_ID = C.HACKER_ID
GROUP BY
H.HACKER_ID, NAME
HAVING
COUNT1 = (SELECT MAX(S1.COUNT3)
FROM
(SELECT COUNT(HACKER_ID) AS 'COUNT3'
FROM CHALLENGES
GROUP BY HACKER_ID) AS S1)
OR COUNT1 IN (SELECT S2.COUNT2
FROM
(SELECT HACKER_ID, COUNT(HACKER_ID) AS 'COUNT2'
FROM CHALLENGES
GROUP BY HACKER_ID) AS S2
GROUP BY
S2.COUNT2
HAVING
COUNT(S2.COUNT2) = 1)
ORDER BY
COUNT1 DESC, H.HACKER_ID;
问题:
实际上此代码可以 运行 在 Mysql 环境中并得到正确的结果但不能 运行 在 SQL 服务器环境中并且我得到一个错误
Invalid column name 'COUNT1'
我想问一下 SQL 服务器这里的确切错误是什么以及 Mysql 和 SQL 服务器之间的区别是什么,因为这个错误只发生在 SQL 服务器但不在 Mysql
就您的查询而言:SQL 服务器不支持在 HAVING
子句中重复使用 FROM
子句中定义的别名。在这方面,SQL 服务器遵循 SQL 标准,MySQL 确实扩展了该标准。您需要重复表达式,这意味着:将 HAVING
子句中的 COUNT1
替换为 COUNT(NAME)
.
我还强烈建议不要用单引号将标识符(这里是 SELECT
子句中的别名)括起来。这不是标准 SQL,并非所有数据库都支持。只要您的标识符不包含特殊字符,就不需要引用它们。
最后:您的查询看起来比它需要的更复杂。如果您要问另一个问题,并提供一个最小的可重现示例(相关表中的示例数据和预期结果),那么有人可能会提出进一步的优化建议。但这不是你在这里问的问题。