我一直在python应用程序中使用sqlite3,在测试时,我的查询有时会导致程序冻结。粗略(来自记忆)的例子:
SELECT id,name FROM main_table WHERE name IN
(SELECT name FROM another_table WHERE another_table.attribute IN
('foo', 'bar', 'baz'))
通常,我第一次尝试这样的事情时,程序就会冻结。现在,如果我首先尝试子查询,然后是整个嵌套的混乱,它几乎立即起作用。
我猜测它会缓存第一个更简单的查询结果,以便下次使用更快,但即便如此,我也想知道如何避免这种停滞。
答案 0 :(得分:1)
您没有提及索引的任何内容......两个表中的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'))
答案 1 :(得分:0)
选择...其中......在...查询通常表现不佳。它们通常被优化器视为可能非常大的系列(name = val1或name = val2或...或name = valn)
尝试使用子查询的内部联接:
SELECT id ,name FROM main_table INNER JOIN another_table on main_table.name=another_table.name and another_table.attribute in ( 'foo','bar','baz' )