说明:
朱莉娅(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中不发生
答案 0 :(得分:2)
就您的查询而言:SQL Server不支持重用FROM
子句中HAVING
子句中定义的别名。在这方面,SQL Server遵循MySQL扩展的SQL标准。您需要重复该表达式,这意味着:将COUNT1
子句中的HAVING
替换为COUNT(NAME)
。
我也强烈建议不要用单引号将标识符(这里是SELECT
子句中的别名)引起来。这不是标准的SQL,并非所有数据库都支持。只要您的标识符不包含特殊字符,就无需引用它们。
最后:您的查询看起来更加复杂。如果您要问另一个问题,并举一个最小的可重现示例(来自相关表的样本数据和预期结果),则可以提出进一步的优化建议。但这不是您在这里问的问题。