2017-01-03 126 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

相關問題