2012-08-12 87 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