SQL查询我开始研究MySQL而不是SQL Server

时间:2017-01-03 20:53:16

标签: mysql sql sql-server

我正在做一个我试图在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的工作示例吗?

(当然,对代码本身的一般批评非常受欢迎,我想要擅长这个)。

1 个答案:

答案 0 :(得分:4)

更改为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,所有列都需要通过分组方法来处理