7

我有两个表:

表 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

如果答案表中没有数据,则下面的查询将返回正确的结果(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

但是这个查询只返回一行

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

上面的查询只返回一行是错误的,因为我在问题表中有两个问题,上面的查询应该返回它们,因为条件“OR a.PersonId IS null”。

为什么它不返回两行?

期望的结果:

我想获取所有问题(2 行)和 PersonId 具有某些价值的答案,例如 Person 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 具有特定值或为空的那些答案。因此,只要有问题的答案,我就不会得到 PersonID 的 NULL 值。

于 2012-06-27T05:30:42.793 回答
6

You can do it just like this:

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

The query still returns records with PersonId = null because of outer join.

于 2013-10-15T03:57:24.783 回答
1

这是您在where应用之前执行加入时所拥有的:

QuestionID    AnswerID    PersonID
1             1           1
2             null        null

实际上, questions 表中只有一条记录匹配(PersonID = 2 or PersonID is null),因此您应该期望只有一行。

你的意思是放

a.PersonId = 1 OR a.PersonId IS null

反而?

于 2012-06-27T04:39:16.853 回答
0

@Yaqub。如果您想显示所有问题,那么我认为您需要应用 RIGHT OUTER JOIN 来替换 Left Outer Join,以便解决所有问题。谢谢

于 2012-06-27T05:15:40.697 回答