我一直在 python 应用程序中使用 sqlite3,在测试它时,我的查询有时会导致程序卡住。一个粗略的(凭内存)示例:
SELECT id,name FROM main_table WHERE name IN
(SELECT name FROM another_table WHERE another_table.attribute IN
('foo', 'bar', 'baz'))
通常,当我第一次尝试这样的事情时,程序就会卡住。现在,如果我先尝试子查询,然后尝试整个嵌套困惑,它几乎立即起作用。
我猜测它正在缓存第一个更简单的查询的结果以供以后使用,这使得下一次的速度更快,但即便如此,我还是想知道如何首先避免这种停顿。
最佳答案
您没有提到任何有关索引的内容...两个表中的 name
至少应该建立索引。
这是使用 JOIN 的等效方法:
SELECT DISTINCT
x.id,
x.name
FROM main_table x
JOIN ANOTHER_TABLE y ON y.name = x.name
AND y.attribute IN ('foo', 'bar', 'baz')
但请注意,如果 ANOTHER_TABLE
中有多个记录与 MAIN_TABLE
记录关联 - JOIN 将产生重复项。因此需要 DISTINCT(或 GROUP BY,如果这是您的偏好)。
EXISTS 可能是比 IN 更好的选择:
SELECT x.id,
x.name
FROM main_table x
WHERE EXISTS(SELECT NULL
FROM ANOTHER_TABLE y
WHERE y.name = x.name
AND y.attribute IN ('foo', 'bar', 'baz'))
关于python - 嵌套 SELECT 查询有时会停止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3965178/