通过column1进行Oracle查询,其中column2是相同的

时间:2016-11-23 08:53:42

标签: oracle join

我在Oracle 9i DB中有这样的表:

+------+------+
| Col1 | Col2 |
+------+------+
|    1 | a    |
|    2 | a    |
|    3 | a    |
|    4 | b    |
|    5 | b    |
+------+------+

Col1是主键,Col2已编入索引。 我输入col1作为我的查询的条件,我想得到col1,其中col2与我的输入相同。 例如,我查询1,结果应为1,2,3。 我知道我可以使用自联接,我想知道是否有更好的方法来做到这一点。

2 个答案:

答案 0 :(得分:2)

我称之为半连接:它是否满足您的自我加入'要求:?

  SELECT * 
    FROM YourTable
   WHERE Col2 IN ( SELECT t2.Col2
                     FROM YourTable t2
                    WHERE t2.Col1 = 1 );

我倾向于避开t2范围变量,如下所示:

  WITH YourTableSearched
       AS ( SELECT Col2
              FROM YourTable
             WHERE Col1 = 1 )
    SELECT * 
      FROM YourTable
     WHERE Col2 IN ( SELECT Col2
                       FROM YourTableSearched );

但TNH我可能会这样做:

  WITH YourTableSearched
       AS ( SELECT Col2
              FROM YourTable
             WHERE Col1 = 1 )
    SELECT *
      FROM YourTable
           NATURAL JOIN YourTableSearched;

答案 1 :(得分:0)

这是可能的。它是否比使用自联接更好(即更高性能),特别是如果col1,col2上有索引,任何人都可以猜测。

假设col1是唯一的,你可以这样做:

SELECT col1
FROM   (SELECT col1,
               col2,
               MAX(CASE WHEN col1 = :p_col1_value THEN col2 END) OVER () col2_comparison
        FROM   your_table)
WHERE col2 = col2_comparison;

并且::p_col1_value = 1:

      COL1
----------
         1
         2
         3

并且::p_col1_value = 5:

      COL1
----------
         4
         5