说明:
茱莉亚要求她的学生创造一些编码挑战。编写一个查询,打印黑客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中
1条答案
按热度按时间o8x7eapl1#
就您的查询而言:SQLServer不支持重用
FROM
合同条款HAVING
条款。在这方面,sqlserver遵循sql标准,mysql确实扩展了这个标准。你需要重复这个表达式,意思是:replaceCOUNT1
在HAVING
带的子句COUNT(NAME)
.我还强烈建议不要围绕标识符(这里是
SELECT
条款)用单引号。这不是标准sql,也不是所有数据库都支持。只要标识符不包含特殊字符,就不需要引用它们。最后:您的查询看起来比需要的更复杂。如果你要问另一个问题,用一个最小的可重复性的例子(来自相关表格的样本数据和预期结果),那么你可能能够建议进一步的优化。但这不是你问的问题。