2
    table1                            table2                   
    id      number                   start    end    indicator
    11      4                         1        5        N
    22      6                         2        7        N  
    33      8                         5        12       Y
    44      10

如果我希望 table1 中的行在 table2 (start,end) 范围内对应,其中两个单独条件的指示符为 Y,那么连接这些表的最有效方法是什么;

  1. table2 中只有一行会有 Y 指示符
  2. table2 中的一行或多行将有一个 Y 指示符

即(坏例子)

SELECT * from table1
WHERE table1.number > (SELECT start from table2 WHERE indicator = 'Y')
AND   table1.number < (SELECT end from table2 WHERE indicator = 'Y')
4

3 回答 3

1
select t1.* 
from table1 t1, table2 t2
where t2.indicator = 'Y'
and t1.number1 > t2.start
and t1.number1 < t2.end

根据您的数据,您可能有兴趣使用并行查询http://docs.oracle.com/cd/E11882_01/server.112/e16638/optimops.htm#PFGRF94608

于 2013-03-26T05:28:50.503 回答
0
从表 1 中选择 *
交叉连接 (
      select start, end from table2 where indicator='Y') B
其中 table1.number > B.start 和 table1.number
于 2013-03-26T05:34:25.203 回答
0

如果 table1 非常大,那么最有效的方法是将查询转换为等值连接,以便在数据集之间获得哈希连接。

with table2_new as (
  select     start + rownum - 1 id
  from       table1
  where      indicator = 'Y'
  connect by level <= (end - start) +1)
select
  table1.id,
  table1.number
from
  table1,
  table2_new
where
  table1.id = table2_new.id;

没有测试过,但以前使用过这种技术。

于 2013-03-26T09:49:27.523 回答