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,并非所有数据库都支持。只要您的标识符不包含特殊字符,就不需要引用它们。

最后:您的查询看起来比它需要的更复杂。如果您要问另一个问题,并提供一个最小的可重现示例(相关表中的示例数据和预期结果),那么有人可能会提出进一步的优化建议。但这不是你在这里问的问题。