0

我正在尝试在 SQL Server 2008 中执行以下 SQL 查询

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)";

这些是表格

问题_评分

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) ";
4

4 回答 4

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

返回结果:

| SUMOFRATE | COUNTOFBEST |
---------------------------
|         1 |           0 |
于 2013-01-09T21:46:41.353 回答
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。

修改查询以用零替换 NULL 值相当容易,但在这种情况下,我认为这不是您的问题。(完全不清楚为什么您需要questionsquestions_rating表的笛卡尔积。)

我认为您的第一步需要是返回您需要返回的行,然后着手应用聚合。

于 2013-01-09T21:39:28.930 回答
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)";
于 2013-01-09T21:38:32.330 回答
1
AND q.best_answer_id IN (SELECT answer_id FROM answers WHERE user_id = 1)

user_id = 1在答案表中没有任何条目,因此此子查询将不返回任何 answer_ids。您已使用此过滤器有效地排除了所有行,并且您的聚合正在正确计算它们。

返回结果的查询没有将此行作为 WHERE 过滤器的一部分。

于 2013-01-09T21:38:57.550 回答