SQLite LEFT JOIN&WHERE子句混淆

前端之家收集整理的这篇文章主要介绍了SQLite LEFT JOIN&WHERE子句混淆前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有两张桌子:

表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表中没有数据,则下面的查询返回正确的结果(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,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,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的两行,因为我在答案表中没有他的数据.

解决方法

我找到了解决方案:

SELECT q.QuestionId,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值.

猜你在找的Sqlite相关文章