对 IN 子句 Oracle 使用子查询



我在使用查询的 IN 子句的子查询时遇到一些问题。 硬编码 IN ..值允许查询快速执行,但使用子查询会减慢所有内容。有没有办法加快此查询速度?

SELECT col1, col2, col3 FROM table1
WHERE ...
and col1 in (SELECT col1 FROM table2)
...

*IN 子句的值将是字符串列表

SELECT col1, col2, col3 FROM table1
WHERE ...
and col1 in ('str1', 'str2', 'str3', ...)
...

以上工作正常。

编辑: 我认为我把问题过于简单化了。我尝试执行的查询如下所示:

SELECT col1, col2, col3, ...
FROM table1 t1, table2 t2
WHERE t1.col1 IN (SELECT col FROM table3)
and t1.col2 < 50
and t2.col3 = t1.col3
...

你不能写select * from.如果给出 select *,则它不了解要与表 2 中的哪一列进行比较。使用所需的列名称。

SELECT * FROM table1
WHERE ...
and col1 in (SELECT col1 FROM table2)
...

改用JOIN

并保留在 table1.col1 或table2.col3 或 table1.col3table3.col上定义的索引:

SELECT col1, col2, col3, ...
FROM table1 t1
INNER JOIN table2 t2 on ( t2.col3 = t1.col3 )
INNER JOIN table3 t3 on ( t1.col1 = t3.col )
WHERE t1.col2 < 50;

切勿FROM子句中使用逗号。始终使用正确、明确、标准JOIN语法。 您应该将查询编写为:

SELECT col1, col2, col3, ...
FROM table1 t1 JOIN
table2 t2
ON t2.col3 = t1.col3
WHERE t1.col1 IN (SELECT col FROM table3) AND
t1.col2 < 50;

我会用EXISTS而不是IN来写这个:

SELECT col1, col2, col3, ...
FROM table1 t1 JOIN
table2 t2
ON t2.col3 = t1.col3
WHERE EXISTS (SELECT 1 FROM table3 t3 WHERE t1.col1 = t3.col) AND
t1.col2 < 50;

过滤全部在table1上;然而,这些列被与不等式进行比较。 我会尝试以下索引:table2(col3)table1(col2, col1)table3(col)

相关内容

  • 没有找到相关文章

最新更新