对 IN 子句使用子查询 Oracle
Using a subquery for IN clause 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 * from,它不明白要与 table2 中的哪一列进行比较。使用您需要的列名。
SELECT * FROM table1
WHERE ...
and col1 in (SELECT col1 FROM table2)
...
改用JOIN,
并保留在 table1.col1 或 table2.col3 或 table1.col3[=20 上定义的索引=] 或 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;
从不 在 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)
.
我在为查询的 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 * from,它不明白要与 table2 中的哪一列进行比较。使用您需要的列名。
SELECT * FROM table1
WHERE ...
and col1 in (SELECT col1 FROM table2)
...
改用JOIN,
并保留在 table1.col1 或 table2.col3 或 table1.col3[=20 上定义的索引=] 或 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;
从不 在 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)
.