【问题标题】:Using a subquery for IN clause Oracle对 IN 子句 Oracle 使用子查询
【发布时间】:2018-11-21 16:45:51
【问题描述】:

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

【问题讨论】:

    标签: sql oracle in-clause


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      使用 JOIN 代替,

      并保留在 table1.col1table2.col3table1.col3table3.col 上定义的索引em>:

      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;
      

      【讨论】:

        【解决方案3】:

        永远不要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)

        【讨论】:

        • 您是否可能遇到了复制/粘贴错误?重复的 SELECT 1 FROM 看起来很可疑。
        • @FrankSchmitt 。 . .谢谢。
        • 不客气。我也删除了重复的FROM
        猜你喜欢
        • 2011-07-21
        • 1970-01-01
        • 2016-04-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-24
        • 2015-04-02
        • 2010-10-23
        相关资源
        最近更新 更多