【问题标题】:Syntax differences between Mysql and SQL ServerMysql 和 SQL Server 的语法差异
【发布时间】:2023-03-17 02:58:01
【问题描述】:

说明:
Julia 要求她的学生创造一些编码挑战。编写查询以打印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 Server环境下不能运行,报错

列名“COUNT1”无效

我想问一下SQL Server中的确切错误是什么以及Mysql和SQL Server之间有什么区别,因为这个错误只发生在SQL Server中而不发生在Mysql中

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-28
      • 2010-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多