我有两张桌子:
表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的两行,因为我在答案表中没有他的数据。
答案 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,这样就可以解决所有问题。感谢