2013-01-09 26 views
0

我試圖執行SQL Server中下面的SQL查詢2008SQL:SUM不COUNT工作,但效果很好獨自

String query = "SELECT SUM(r.rate),COUNT(q.best_answer_id) " + 
          "FROM questions_rating r,questions q " + 
          "WHERE r.question_id IN (SELECT question_id FROM questions WHERE user_id = 1) "+ 
          "AND q.best_answer_id IN (SELECT answer_id FROM answers WHERE user_id = 1)"; 

這些都是表

Questions_Rating

id---------question_id-----------user_id--------rate 
1    1     1   1 
2    1     2   1 
3    1     3   -1 
4    2     1   -1 

只能是1或-1。

問題

question_id------question-------user_id-------best_answer_id 
1     lala   1    3 
2     lala   2    5 

答案

answer_id---------answer--------user_id------question_id 
1     lala   4    1 
2     kaka   5    1 
3     dada   6    1 
4     fafa   7    2 
5     tata   8    2 

該查詢返回這些結果

SUM------COUNT 
NULL  0 

雖然它應該返回......

SUM------COUNT 
1   0 

請注意,下面的查詢返回正確的結果(1)

String query = "SELECT SUM(r.rate) " + 
          "FROM questions_rating r " + 
          "WHERE r.question_id IN (SELECT question_id FROM questions WHERE user_id = 1) "; 
+3

哎,你爲什麼要使用舊的式連接?你的加入標準是什麼?我似乎無法找到它? –

+0

我想你應該看看如何使用RIGHT JOIN而不是使用子選擇 – Popnoodles

+2

@popnoodles右連接會做什麼左連接不能? –

回答

3

我想你應該考慮重寫查詢中使用JOINS,而不是你的子查詢:

SELECT 
    SUM(r.rate) SumOfRate, 
    COUNT(a.answer_id) CountOfBest 
FROM questions_rating r 
INNER JOIN questions q 
    ON r.question_id = q.question_id 
    AND r.user_id = q.user_id 
LEFT JOIN answers a 
    ON q.best_answer_id = a.answer_id 
    AND a.user_id = 1 
WHERE r.user_id = 1 

SQL Fiddle with Demo

返回結果:

| SUMOFRATE | COUNTOFBEST | 
--------------------------- 
|   1 |   0 | 
1

當您加入表你的r.rate得到NULL值。嘗試使用ISNULL功能檢查這樣的NULL值:

String query = "SELECT SUM(ISNULL(r.rate,0)),COUNT(ISNULL(q.best_answer_id),0)) " + 
          "FROM questions_rating r,questions q " + 
          "WHERE r.question_id IN (SELECT question_id FROM questions WHERE user_id = 1) "+ 
          "AND q.best_answer_id IN (SELECT answer_id FROM answers WHERE user_id = 1)"; 
+0

沒有工作,我得到了相同的結果。編輯:COUNT(ISNULL(q.best_answer_id,0)) –

+1

然後,正如其他人指出,你可能不會從你的查詢中得到任何結果。 – squillman

1
AND q.best_answer_id IN (SELECT answer_id FROM answers WHERE user_id = 1) 

你沒有條目時user_id = 1的答案表,所以這個子查詢將不返回answer_ids。您已經有效地排除了使用此過濾器的所有行,並且您的聚合會正確計算它們。

返回結果的查詢沒有將該行作爲WHERE過濾器的一部分。

1

最可能的解釋是您的查詢沒有返回任何行。

我建議你刪除聚集,並檢查結果,例如:

SELECT r.rate 
    , q.best_answer_id 
    FROM questions_rating r 
CROSS 
    JOIN questions q 
WHERE r.question_id IN 
     (SELECT question_id FROM questions WHERE user_id = 1) 
    AND q.best_answer_id IN 
     (SELECT answer_id FROM answers WHERE user_id = 1) 

我相信你會發現,沒有行返回。在這種情況下,COUNT()聚合將合理返回0,並且SUM()聚合將返回NULL。

修改查詢以將零值替換爲零非常容易,但在這種情況下,我不相信這是您的問題。 (這完全不清楚你爲什麼想要questionsquestions_rating表的笛卡爾乘積。)

我認爲你的第一步需要獲得返回的行,你需要返回,然後着手獲取應用的聚合。

相關問題