2017-01-03 124 views
0

我正在做一个我试图在SQL Server中完成的任务,因为这是我将在新工作中使用的语言。我完成了我的查询是这样的:SQL查询我可以在MySQL上工作,但不能在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中。我想我会用,而不是在JOIN语句SELECT查询CTE,所以我调整了这个使用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; 

但是这将引发一个错误:

Invalid column name 'scr'.

(它说在第6行,但从经验,我用来完成这些任务的网站可能有点错误线错误)。

是否有人可以告诉我错过了什么,以及SQL Server的工作示例?

(当然,对代码本身的普遍批评非常受欢迎,我希望能够在这方面做得更好)。

+0

的可能的复制[选择SQL中的列不在群组中](http://stackoverflow.com/questions/11991079/select-a-column-in-sql-not-in-group-by) –

+0

Just Vocab:CET(Common Expression Table?)或CTE(公用表表达式)? (我通常看CTE不是CET) – xQbert

+0

@xQbert啊谢谢!得到缩写的顺序错误:) – Cenderze

回答

4

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

因为select得到AFTER having条款,这意味着src当已经获得exectued不存在执行。

更新答案:

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,所有列需要通过分组方法把照顾

+0

因为'select'在执行后有''这意味着'有'执行时'src'不存在 – LONG

+1

如果你想修改或扩展你的答案,那么你应该编辑它,不评论它。 –

+0

@JohnBollinger thx纠正我:) – LONG

相关问题