我正在做一个尝试在SQL Server中完成的任务,因为这是我在新工作中将使用的语言。我是这样完成查询的:

SELECT
    h.hacker_id, h.name, sum(scr) AS tot
FROM
    hackers AS h
JOIN
    (SELECT
         s2.hacker_id, s2.challenge_id, max(s2.score) AS scr
     FROM
         submissions s2
     GROUP BY
         s2.hacker_id, s2.challenge_id
     HAVING
         scr > 0) AS CET ON h.hacker_id = CET.hacker_id
GROUP BY
    h.hacker_id
ORDER BY
    tot DESC, h.hacker_id;


该查询在MySQL中有效(例如,这是一个正确的解决方案),但在SQL Server中不起作用。我想在SELECT语句中使用CTE而不是JOIN查询,因此我将其调整为使用CTE而不是这样:

WITH CTE AS
(
    SELECT
        s2.hacker_id, s2.challenge_id, max(s2.score) AS scr
    FROM
        submissions s2
    GROUP BY
        s2.hacker_id, s2.challenge_id
    HAVING
        scr > 0
)
SELECT
    h.hacker_id, h.name, sum(scr) as tot
FROM
    hackers AS h
JOIN
    CTE ON h.hacker_id = CTE.hacker_id
GROUP BY
    h.hacker_id
ORDER BY
    tot DESC, h.hacker_id;


但这会引发错误:


  无效的列名“ scr”。


(它在第6行上说,但根据经验,我用来完成这些任务的网站可能对行错误指示器有些疑惑)。

有人可以说明我错过的内容以及SQL Server的有效示例吗?

(当然,对代码本身的一般批评也很受欢迎,我想对此有所作为)。

最佳答案

更改为HAVING max(s2.score)>0

因为selecthaving子句之后执行,这意味着src在执行后不存在。

更新的答案:

SELECT h.hacker_id, h.name, sum(scr) AS tot
FROM hackers AS h JOIN (
     SELECT s2.hacker_id, s2.challenge_id, max(s2.score) AS scr
     FROM submissions s2
     GROUP BY s2.hacker_id, s2.challenge_id
     HAVING max(s2.score) > 0) AS CET
ON h.hacker_id = CET.hacker_id
GROUP BY h.hacker_id,h.name
ORDER BY tot DESC, h.hacker_id;


您发现错误是因为h.name不在group by clause中,所有列都需要通过分组方法来处理

关于mysql - 我可以在MySQL上工作但无法在SQL Server上工作的SQL查询,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41452168/

10-17 00:43