7

私は2つのテーブルを持っています:

表1:質問

QuestionId NUMERIC
Title      TEXT

質問表のテストデータ:

QuestionId     Title
1              What is your name?
2              What is your age?

表2:回答:

AnswerId     NUMERIC
PersonId     NUMERIC
QuestionId   NUMERIC
Answer       TEXT

Answers TableにDATAがない場合、以下のクエリは正しい結果(2行)を返します

SELECT  q.QuestionId, q.Title, a.Answer
FROM    Questions q
    LEFT OUTER JOIN Answers a ON q.QuestionId = a.QuestionId
WHERE    a.PersonId = 2 OR a.PersonId IS null

しかし、たとえば、回答テーブルに次のようなレコードが1つある場合

AnswerId     1
PersonId     1
QuestionId   1
Answer       'My Name is Yaqub'

以下のクエリは正常に機能します。

SELECT  q.QuestionId, q.Title, a.Answer
FROM    Questions q
    LEFT OUTER JOIN Answers a ON q.QuestionId = a.QuestionId
WHERE    a.PersonId = 1 OR a.PersonId IS null

しかし、このクエリは1行だけを返します

SELECT  q.QuestionId, q.Title, a.Answer
FROM    Questions q
    LEFT OUTER JOIN Answers a ON q.QuestionId = a.QuestionId
WHERE    a.PersonId = 2 OR a.PersonId IS null

上記のクエリは間違った1行だけを返します。これは、質問テーブルに2つの質問があり、条件'OR a.PersonId IS null'のため、上記のクエリは両方を返す必要があるためです。

なぜ2行を返さないのですか?

望ましい結果:

すべての質問(2行)と、PersonIdに値がある場合の回答を取得したいと思います。たとえば、回答テーブルに彼のデータがないため、Person2の場合は2行です。

4

4 に答える 4

9

私は解決策を見つけました:

SELECT q.QuestionId, q.Title, a.Answer
FROM Questions q
 LEFT OUTER JOIN Answers a ON q.QuestionId = a.QuestionId AND 
(a.PersonId = 2 OR a.PersonId IS null)

このクエリはすべての質問を一覧表示し、WHERE句はPersonIDが特定の値を持っているかnullである回答を除外します。したがって、質問に対する回答がある場合は常に、PersonIDのNULL値は取得されません。

于 2012-06-27T05:30:42.793 に答える
6

あなたはこのようにそれを行うことができます:

SELECT q.QuestionId, q.Title, a.Answer
FROM Questions q
 LEFT OUTER JOIN Answers a ON q.QuestionId = a.QuestionId AND 
a.PersonId = 2

外部結合のため、クエリは引き続きPersonId=nullのレコードを返します。

于 2013-10-15T03:57:24.783 に答える
1

whereこれは、が適用される前に、結合を行うときに持っているものです。

QuestionID    AnswerID    PersonID
1             1           1
2             null        null

に一致する質問テーブルには実際には1つのレコードしかない(PersonID = 2 or PersonID is null)ため、1行だけを期待する必要があります。

置くつもりでしたか

a.PersonId = 1 OR a.PersonId IS null

代わりは?

于 2012-06-27T04:39:16.853 に答える
0

@Yaqub。それ以降のすべての質問を表示したい場合は、すべての質問に対応できるように、RIGHTOUTERJOINを適用してLeftOuterJoinを置き換える必要があると思います。ありがとう

于 2012-06-27T05:15:40.697 に答える