mysql与sqlserver的语法差异

x6yk4ghg  于 2021-07-27  发布在  Java
关注(0)|答案(1)|浏览(336)

说明:
茱莉亚要求她的学生创造一些编码挑战。编写一个查询,打印黑客id、姓名和每个学生创建的挑战总数。按挑战总数降序排列结果。如果多个学生创建了相同数量的挑战,则按黑客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环境下运行,得到了正确的结果,但是不能在sqlserver环境下运行,我得到了一个错误
列名“count1”无效
我想问一下,在sqlserver中到底有什么错误,mysql和sqlserver有什么区别,因为这个错误只发生在sqlserver中,而不发生在mysql中

o8x7eapl

o8x7eapl1#

就您的查询而言:SQLServer不支持重用 FROM 合同条款 HAVING 条款。在这方面,sqlserver遵循sql标准,mysql确实扩展了这个标准。你需要重复这个表达式,意思是:replace COUNT1HAVING 带的子句 COUNT(NAME) .
我还强烈建议不要围绕标识符(这里是 SELECT 条款)用单引号。这不是标准sql,也不是所有数据库都支持。只要标识符不包含特殊字符,就不需要引用它们。
最后:您的查询看起来比需要的更复杂。如果你要问另一个问题,用一个最小的可重复性的例子(来自相关表格的样本数据和预期结果),那么你可能能够建议进一步的优化。但这不是你问的问题。

相关问题