Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
最佳SQLite查询删除重复项_Sql_Sqlite - Fatal编程技术网

最佳SQLite查询删除重复项

最佳SQLite查询删除重复项,sql,sqlite,Sql,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) 上面的查询工作正常。我

我有两个具有以下设置的表:

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)
上面的查询工作正常。我只是想知道这是否是执行查询的最佳方式,或者我是否可以通过连接或使用连接执行其他操作:

SELECT c.id, c.name
FROM   category c
JOIN item i on c.id=i.category_id 
GROUP BY c.id, c.name
正在将“在选择中”转换为“存在选择”。。。可能有帮助的地方:

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:

如果速度如此重要,请不要忘记随时调用ANALYZE:

其他一些有趣的变体:

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

我赌的是查询,就在娱乐之后。
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