2012-08-12 90 views
4

我有两个表具有以下设置:优化SQLite的查询删除重复

category: (id, name) 
item: (id, name, category_id) - category_id is foreign key to category table 

现在我写一个查询,以便从仅用于类别的分类表中检索一个子集:

SELECT c.id, c.name 
FROM category c 
WHERE c.id IN (SELECT DISTINCT category_id FROM item) 

上述查询工作正常。我只是还是想知道,如果这是在做查询的最优化的方式,如果有别的东西,我可以通过加入或东西

回答

5

改造IN (SELECT)EXISTS (SELECT ... WHERE)威力求助:

SELECT c.id, c.name 
FROM category c 
WHERE EXISTS (SELECT 1 FROM item WHERE item.category_id = c.id) 

另一种可能(我希望它是慢,但它总是取决于你的数据库):

SELECT c.id, c.name 
FROM category c 
INNER JOIN item ON item.category_id = c.id 
GROUP BY c.id 

或者你可以使用DISTINCT代替GROUP BY

SELECT DISTINCT c.id, c.name 
FROM category c 
INNER JOIN item ON item.category_id = c.id 

如果速度是重要的,不要忘记调用ANALYZE不时:

http://www.sqlite.org/lang_analyze.html

其他一些变种为了好玩:

SELECT c.id, c.name 
FROM category c 
INNER JOIN (SELECT DISTINCT item.category_id) AS i_c ON i_c.category_id = c.id 

另一种:

SELECT c.id, c.name 
FROM category c 

EXCEPT 

SELECT c.id, c.name 
FROM category c 
LEFT JOIN item ON item.category_id = c.id 
WHERE item.category_id IS NULL 
+1

我的赌注是在查询中,就在*“fun”*之后。 – 2012-08-12 23:37:16

+0

谢谢biziclop! – goodnoodle 2012-08-14 00:06:25

0

用做加入:

SELECT c.id, c.name 
FROM category c 
JOIN item i on c.id=i.category_id 
GROUP BY c.id, c.name