2012-12-05 71 views
0

我有一个查询返回多行的子查询。SQLite子查询

我有一个带有列表和用户表的表格。我在这两个表之间创建了一个名为list_user的多对多表。

LIST 
id INTEGER 
list_name TEXT 
list_description TEXT 

USER 
id INTEGER 
user_name TEXT 

LIST_USER 
id INTEGER 
list_id INTEGER 
user_id INTEGER 

我与子查询

SELECT * FROM user WHERE id = (SELECT user_id FROM list_user WHERE list_id = 0); 

子查询作品查询(我使用它的代码,以便在0实际上是一个变量),并返回多行。但上层查询只返回一行,这非常合理;我检查id是否等于某个东西,它只检查子查询的第一行。

如何更改我的语句,以便在上部查询中获取多行?

回答

5

我很惊讶=在SQLite中的作品。它会在大多数数据库中返回一个错误。在任何情况下,你想要的in声明:

SELECT * 
FROM list 
WHERE id in (SELECT user_id FROM list_user WHERE list_id = 0); 
+0

事实上,虽然它确实提高了查询(试图在SQLite的浏览器),我的代码仍然只返回1行。我的查询SELECT * FROM person WHERE id IN(SELECT user_id FROM list_user WHERE user_id = 2);返回1行。 SELECT user_id FROM list_user WHERE user_id = 2; (子查询)返回2行。我只是印了它......为什么这样做? – user1810737

+0

这两行是否有相同的user_id? –

+0

不,在这种情况下,它们具有user_id 1和user_id 2。 – user1810737

2

为了更好的性能,使用此查询:

SELECT LIST.ID, 
     LIST.LIST_NAME, 
     LIST.LIST_DESCRIPTION 
FROM LIST, 
     USER, 
     LIST_USER 
WHERE LIST.ID = LIST_USER.USER_ID = USER.ID AND 
     LIST.LIST_ID = 0 
+0

我会在稍后的阶段看看这个,谢谢。 – user1810737

+1

我只是因为它没有使用正确的连接语法而试图降低它的性能。你能解释为什么这会有更好的表现吗? –