我正在做一个尝试在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
因为select
在having
子句之后执行,这意味着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/