我有两个表,具有以下设置:
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)
解决方法
将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