Mysql和SQL Server之间的语法差异

时间:2020-07-29 22:38:49

标签: sql sql-server join count having-clause

说明:
朱莉娅(Julia)要求她的学生提出一些编码挑战。编写查询以打印每个学生创建的hacker_id,姓名和挑战总数。按挑战总数按降序对结果进行排序。如果有多个学生提出了相同数量的挑战,则按hacker_id对结果进行排序。如果一个以上的学生创建了相同数量的挑战,并且该数量少于创建的最大挑战数,则从结果中排除这些学生。

enter image description here

这是我的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 Server环境中运行并且出现错误

无效的列名“ COUNT1”

我想问一下SQL Server中的确切错误是什么,Mysql和SQL Server有什么区别,因为此错误仅在SQL Server中发生,而在Mysql中不发生

1 个答案:

答案 0 :(得分:2)

就您的查询而言:SQL Server不支持重用FROM子句中HAVING子句中定义的别名。在这方面,SQL Server遵循MySQL扩展的SQL标准。您需要重复该表达式,这意味着:将COUNT1子句中的HAVING替换为COUNT(NAME)

我也强烈建议不要用单引号将标识符(这里是SELECT子句中的别名)引起来。这不是标准的SQL,并非所有数据库都支持。只要您的标识符不包含特殊字符,就无需引用它们。

最后:您的查询看起来更加复杂。如果您要问另一个问题,并举一个最小的可重现示例(来自相关表的样本数据和预期结果),则可以提出进一步的优化建议。但这不是您在这里问的问题。

相关问题