SQLite LEFT JOIN&条款混乱

时间:2012-06-27 04:32:23

标签: sqlite left-join where-clause

我有两张桌子:

表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

上面的查询只返回一行是错误的,因为我在问题表中有两个问题&由于条件'或者a.PersonId为空',上面的查询应该返回它们。

为什么它没有返回两行?

期望的结果:

我想得到所有问题(2行)&那些PersonId有一些价值的答案,例如Person 2的两行,因为我在答案表中没有他的数据。

4 个答案:

答案 0 :(得分: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 OR a.PersonId IS null)

此查询将列出所有问题& WHERE子句将过滤掉PersonID具有特定值或为null的答案。所以只要有问题的答案,我就不会得到PersonID的NULL值。

答案 1 :(得分:5)

你可以这样做:

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的记录。

答案 2 :(得分:1)

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

QuestionID    AnswerID    PersonID
1             1           1
2             null        null

问题表中只有一条记录与(PersonID = 2 or PersonID is null)匹配,因此您只需要一行。

你的意思是

a.PersonId = 1 OR a.PersonId IS null

代替?

答案 3 :(得分:0)

@Yaqub。如果你想显示从那时起的所有问题,我认为你需要应用RIGHT OUTER JOIN来替换Left Outer Join,这样就可以解决所有问题。感谢