我正在做一个我试图在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的工作示例吗?
(当然,对代码本身的一般批评非常受欢迎,我想要擅长这个)。
答案 0 :(得分:4)
更改为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
,所有列都需要通过分组方法来处理