Yaq*_*mad 4 sqlite left-join where-clause
我有两张桌子:
表1:问题:
QuestionId NUMERIC
Title TEXT
Run Code Online (Sandbox Code Playgroud)
问题表中的测试数据:
QuestionId Title
1 What is your name?
2 What is your age?
Run Code Online (Sandbox Code Playgroud)
表2:答案:
AnswerId NUMERIC
PersonId NUMERIC
QuestionId NUMERIC
Answer TEXT
Run Code Online (Sandbox Code Playgroud)
如果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
Run Code Online (Sandbox Code Playgroud)
但是,如果我在答案表中有例如1条记录,例如:
AnswerId 1
PersonId 1
QuestionId 1
Answer 'My Name is Yaqub'
Run Code Online (Sandbox Code Playgroud)
以下查询工作正常:
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
Run Code Online (Sandbox Code Playgroud)
但是这个查询只返回一行:
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
Run Code Online (Sandbox Code Playgroud)
上面的查询只返回一行是错误的,因为我在问题表中有两个问题,上面的查询应该返回它们两个因为条件'或a.PersonId IS null'.
为什么它没有返回两行?
期望的结果:
我想获得所有问题(2行)和PersonId具有某些值的答案,例如Person 2的两行,因为我在答案表中没有他的数据.
我找到了解决方案:
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)
Run Code Online (Sandbox Code Playgroud)
此查询将列出所有问题,WHERE子句将过滤掉PersonID具有特定值或为null的答案.因此,只要有问题的答案,我就不会获得PersonID的NULL值.
小智 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
Run Code Online (Sandbox Code Playgroud)
由于外部联接,查询仍然返回PersonId = null的记录。
| 归档时间: |
|
| 查看次数: |
13972 次 |
| 最近记录: |