使用IN子句Oracle

时间:2018-06-12 10:09:19

标签: sql oracle in-clause

我在查询的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
...

3 个答案:

答案 0 :(得分:2)

你不能写select * from。如果你给select * from,它不知道从table2比较哪个列。使用您需要的列名称。

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

答案 1 :(得分:0)

改为使用 JOIN

并在 table1.col1 table2.col3 table1.col3 table3.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;

答案 2 :(得分:0)

从不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)