select * from
A
left outer join
B
on
(
B.b1 < (decode(a.a1, 0, c.c1))
B.b2 = A.a2
);
我知道on里面不能有子查询,也试过写成如下形式
select * from
A
left outer join
B,
C
on
(
B.b2 = A.a2
)
where
B.b1 < (decode(a.a1, 0, c.c1))但是结果都和预期的不一样, 逻辑不能变,请问怎么workaround?

解决方案 »

  1.   

    这么说吧,比较以下两个结果:
    SQL> select a.orig_type,  s.primary_offer_id from ADJ a left outer join
      2  SUBSCRIBER_BILLING S
      3  on
      4  (
      5   S.subscr_no = a.subscr_no   AND
      6   S.subscr_no_resets = a.subscr_no_resets AND
      7   S.active_dt <= a.TRANSACT_DATE AND
      8   (S.inactive_dt > a.TRANSACT_DATE OR
      9   S.inactive_dt is null)
     10  ); ORIG_TYPE PRIMARY_OFFER_ID
    ---------- ----------------
             2          1000313
             2
             2
             2
             3          1000313
    另一种写法:
    select a.orig_type,  s.primary_offer_id from ADJ a left outer join 
    SUBSCRIBER_BILLING S
    on
    (
     S.subscr_no = a.subscr_no   AND
     S.subscr_no_resets = a.subscr_no_resets
    ),
    (
     select TRANSACT_DATE  trans_date ,subscr_no,subscr_no_resets from ADJ aj
    ) trans_table
    where
    S.active_dt <= trans_table.trans_date AND
    (S.inactive_dt > trans_table.trans_date OR
    S.inactive_dt is null) AND
    S.subscr_no = trans_table.subscr_no   AND
    S.subscr_no_resets = trans_table.subscr_no_resets;
    ORIG_TYPE PRIMARY_OFFER_ID
    ---------- ----------------
             2          1000313
             2          1000313
             3          1000313
             3          1000313
      

  2.   

    这说明不能把on里面那个子查询放进where里面去,SUBSCRIBER_BILLING 和 trans_table先在where里面做了一个join, 然后再与ADJ进行匹配,所以有些行会是重复的. 
    回到最初的问题,那个on里面包含子查询可以怎么改呢? 
      

  3.   

    首先 
    A
    left outer join
    B,
    C 这是错误的 要连两个表以上要这么写
     A LEFT JOIN B ON 
        LEFT JOIN C ON。 其次 decode(a.a1, 0, c.c1) 这里也错  你A表和C表还没连起来 不能用这样的操作最后  LEFT JOIN 就是 outer  不需要再加这个 outer 了 ,当然加了也没问题 
    你可以这么写 
    select *
      from A
      left join B
        on B.b2 = A.a2
      left join c
        on A 和C 连接的条件
     where B.b1 < (decode(a.a1, 0, c.c1))
      

  4.   

    我讨厌left join ,right join
      

  5.   


    select *
      from A
      left join B
      on B.b2 = A.a2
      left join c
      on A 和C 连接的条件
     where B.b1 < (decode(a.a1, 0, c.c1)) 
    给五楼做一些补充,改成这样:select *
      from A
      left join B
      on B.b2 = A.a2
      left join c
      on A 和C 连接的条件
     where B.b1 < (decode(a.a1, 0, c.c1))  or  B.b1 is null
    否则A与B的左外连接将失效。
      

  6.   

    在解析时,where优先还是JOIN优先?还是没看明白...