0

SQLServer2008で次の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)";

これらはテーブルです

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) ";
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 FiddlewithDemoを参照してください

結果を返します:

| SUMOFRATE | COUNTOFBEST |
---------------------------
|         1 |           0 |
于 2013-01-09T21:46:41.353 に答える
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 に答える
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()アグリゲートは合理的に0SUM()を返し、アグリゲートはNULLを返します。

クエリを変更してNULL値をゼロに置き換えるのはかなり簡単ですが、この場合、それが問題であるとは思われません。questions(とquestions_ratingテーブルのデカルト積が必要な理由はまったくわかりません。)

最初のステップは、返す必要のある行を返し、次に集計を適用することです。

于 2013-01-09T21:39:28.930 に答える