我有两个表,具有以下设置:
category: (id, name)
item: (id, name, category_id) - category_id is foreign key to category table
Run Code Online (Sandbox Code Playgroud)
现在我正在编写一个查询来检索仅使用类别的类别表中的子集:
SELECT c.id, c.name
FROM category c
WHERE c.id IN (SELECT DISTINCT category_id FROM item)
Run Code Online (Sandbox Code Playgroud)
以上查询工作正常.我只是想知道这是否是进行查询的最佳方式,或者是否还有其他我可以通过连接或其他方式做的事情
转换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)
Run Code Online (Sandbox Code Playgroud)
另一种可能性(我希望它更慢,但它总是取决于你的数据库):
SELECT c.id, c.name
FROM category c
INNER JOIN item ON item.category_id = c.id
GROUP BY c.id
Run Code Online (Sandbox Code Playgroud)
或者您可以使用DISTINCT而不是GROUP BY:
SELECT DISTINCT c.id, c.name
FROM category c
INNER JOIN item ON item.category_id = c.id
Run Code Online (Sandbox Code Playgroud)
如果速度非常重要,请不要忘记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
Run Code Online (Sandbox Code Playgroud)
另一个:
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
Run Code Online (Sandbox Code Playgroud)