Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQLite左连接&;WHERE子句混淆_Sqlite_Left Join_Where Clause - Fatal编程技术网

SQLite左连接&;WHERE子句混淆

SQLite左连接&;WHERE子句混淆,sqlite,left-join,where-clause,Sqlite,Left Join,Where Clause,我有两张桌子: 表1:问题: QuestionId NUMERIC Title TEXT 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 AnswerId 1 PersonId 1 Q

我有两张桌子:

表1:问题

QuestionId NUMERIC
Title      TEXT
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
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 = 2 OR a.PersonId IS null
问题表中的测试数据:

QuestionId     Title
1              What is your name?
2              What is your age?
AnswerId     NUMERIC
PersonId     NUMERIC
QuestionId   NUMERIC
Answer       TEXT
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)
表2:答案:

QuestionId     Title
1              What is your name?
2              What is your age?
AnswerId     NUMERIC
PersonId     NUMERIC
QuestionId   NUMERIC
Answer       TEXT
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)
如果答案表中没有数据,则下面的查询返回正确的结果(2行):

QuestionId NUMERIC
Title      TEXT
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
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 = 2 OR a.PersonId IS null
但是如果我在回答表中有例如1条记录,如

QuestionId NUMERIC
Title      TEXT
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
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 = 2 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 = 1 OR a.PersonId IS null
但此查询只返回一行

QuestionId NUMERIC
Title      TEXT
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
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 = 2 OR a.PersonId IS null
上面的查询只返回一行,这是错误的,因为问题表中有两个问题&上面的查询应该返回这两个问题,因为条件“OR a.PersonId为null”

为什么不返回两行?

期望的结果:

QuestionId     Title
1              What is your name?
2              What is your age?
AnswerId     NUMERIC
PersonId     NUMERIC
QuestionId   NUMERIC
Answer       TEXT
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)

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

这是在应用
之前进行连接时所拥有的:

QuestionID    AnswerID    PersonID
1             1           1
2             null        null
实际上,问题表中只有一条记录与
(PersonID=2或PersonID为null)
匹配,因此您应该只需要一行

你的意思是说

a.PersonId = 1 OR a.PersonId IS null

取而代之的是

@Yaqub。如果你想显示所有的问题,那么我认为你需要应用右外连接来代替左外连接,这样它将接受所有的问题。谢谢

我找到了解决方案:

QuestionId     Title
1              What is your name?
2              What is your age?
AnswerId     NUMERIC
PersonId     NUMERIC
QuestionId   NUMERIC
Answer       TEXT
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都不会有空值。

您可以这样做:

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

是的,这就是我需要的。。。我需要从基于PersonId的问题表中获取数据。@YaqubAhmad-Blorgbeard想说的是你的
where
子句过滤掉了第二行。如果不指定PersonId为null的
,那么查询将返回两行。实际上,我需要为不同的人获取问题,因此我的where子句可以是a.PersonId=1,a.PersonId=1等等。请再次检查我的问题。@JackManey:我有一个.PersonId为null,因此它应该返回两行。同样,您要求
PersonId
为null,以过滤掉第二行。如果你想要两行,那么不要限制。就这么简单。不,这将显示所有答案(答案在连接的右侧)。要显示所有问题,他只需删除where子句。@YaqubAhmad-然后更改要加入的表的顺序。嘘!仅供参考,这是一个相关子查询,众所周知,相关子查询在性能方面非常糟糕。你为什么不做明智的事,删除你的
where
子句呢?很抱歉回复晚了,我很忙!!我不能排除where子句,因为我需要显示每个人的问题和答案(如果该人有答案)。where子句将过滤掉PersonID具有特定值或为空的答案。因此,无论何时有问题的答案,PersonIDgreat都不会得到空值!我的SQLite版本不接受外部,但除此之外,您解决了我的问题。我不是投反对票的人,但你的问题不是很清楚。