我在Oracle 9i DB中有这样的表:
+------+------+
| Col1 | Col2 |
+------+------+
| 1 | a |
| 2 | a |
| 3 | a |
| 4 | b |
| 5 | b |
+------+------+
Col1是主键,Col2已编入索引。 我输入col1作为我的查询的条件,我想得到col1,其中col2与我的输入相同。 例如,我查询1,结果应为1,2,3。 我知道我可以使用自联接,我想知道是否有更好的方法来做到这一点。
答案 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