表一:t1字段有mc表二:t2
字段有mc和lbt1根据mc相同,获取mc对应的lb怎么写比较好,数据量很大:几万到几十万

解决方案 »

  1.   

    mc建索引,你分别试试hash join和nested loop,t2做驱动表。
      

  2.   

    我用select * from t1 a,t2 b where a.mc=b.mc(+),但是想加上 
    select * from t1 a,t2 b where a.mc=b.mc(+) and lb='1' or lb='2'就出错,怎么改写达到同样目的呢
      

  3.   

    你的or是不是漏掉了括号?逻辑是两个or应该连在一起吧?
      

  4.   


    这里t1和t2里都含有mc这个column,所以会报错select t1.*, t2.* from t1 a,t2 b where a.mc=b.mc(+) and lb='1' or lb='2'或者只是把你关系的column显示的写到select ... from里
      

  5.   

    相对于你的lb='1' or lb='2,假设我的条件是bbb='a' or bbb='c'
    你的查询是不是这个意思?OPER@tl> select * from test;       AAA
    ----------
             1
             2
             3
             4
             5
             6
             7
             8
             9已选择9行。OPER@tl> select * from test2;       AAA BBB
    ---------- --------------------
             1 a
             2 a
             4 c
             7 b
             8 c
             9 b已选择6行。OPER@tl> select aaa,decode(bbb,'a',bbb,'c',bbb,null)
      2  from (
      3  select a.aaa,b.bbb
      4  from  test a,test2 b
      5  where a.aaa=b.aaa(+))
      6  order by aaa
      7  /       AAA DECODE(BBB,'A',BBB,'
    ---------- --------------------
             1 a
             2 a
             3
             4 c
             5
             6
             7
             8 c
             9已选择9行。OPER@tl>
      

  6.   

    具体连接方式,你用hash join和nested loop都试试,最后的order by 也可以去掉。
      

  7.   

    数据量很大:几万到几十万...
    ----
    这点小数据没啥影响的。
    普通的连接sql就可以了啊。
      

  8.   


    如果仅选4条记录,那不存在左连接。
    直接
    select * from t1 a,t2 b where a.mc=b.mc
      

  9.   

    用内连接可以吗?
    SELECT T1.MC,T2.LB FROM T1 INNER JOIN T2 ON T1.MC=T2.MC;
    这样可以将笛卡尔乘积避开,将最少的记录做连接。如果两表在MC上还建有索引的话,哪就是瞬间的事情了。
    另外,大家都都说内连接其实跟直接做笛卡尔乘积是同样的,完全等价的,是这样吗?
    SELECT * FROM A,B WHERE A.ID=B.ID;

    SELECT A.* FROM A INNER JOIN B ON A.ID=B.ID;
    是一样的吗?除了结果是一样的外,他们的处理过程是一样的吗?