我也没试过写这么多+,看是不是这样
select X.sfzmhm
  from X, A, B, C, D, E, F
 WHERE X.sfzmhm = A.sfzmhm(+)
   AND X.sfzmhm = B.sfzmhm(+)
   and B.id >= 1
   AND C.sfzmhm(+) = X.sfzmhm
   AND D.sfzmhm(+) = X.sfzmhm
   and D.hm(+) = B.id
   AND A.mc = E.bh(+)
   AND F.sn(+) = C.sn
   and F.lx(+) = B.id

解决方案 »

  1.   


    对 刚才编辑时编辑错了,我实际是这样写的:select X.sfzmhm from X,A,B,C,D,E,F
     where X.sfzmhm = A.sfzmhm(+)
     and 
     X.sfzmhm = B.sfzmhm(+) and B.id(+)>=1
     and
     X.sfzmhm = C.sfzmhm(+)
     and
     X.sfzmhm = D.sfzmhm(+) and D.hm=B.id
     and
     A.mc = E.bh
     and
     F.sn=C.sn and F.lx=B.id!!!!!!!!!!!但是查出来结果比left join少了很多!
      

  2.   


    left join似乎是连起来最后再筛选,
    (+)似乎是先筛选了再连.
    怎样才能达到left join的效果而又不用left join呢?
      

  3.   


    对 刚才编辑时编辑错了,我实际是这样写的:select X.sfzmhm from X,A,B,C,D,E,F
     where X.sfzmhm = A.sfzmhm(+)
     and 
     X.sfzmhm = B.sfzmhm(+) and B.id(+)>=1
     and
     X.sfzmhm = C.sfzmhm(+)
     and
     X.sfzmhm = D.sfzmhm(+) and D.hm=B.id
     and
     A.mc = E.bh
     and
     F.sn=C.sn and F.lx=B.id!!!!!!!!!!!但是查出来结果比left join少了很多!
    你的E和F已经inter join了,肯定少了阿
      

  4.   


    对 刚才编辑时编辑错了,我实际是这样写的:select X.sfzmhm from X,A,B,C,D,E,F
     where X.sfzmhm = A.sfzmhm(+)
     and 
     X.sfzmhm = B.sfzmhm(+) and B.id(+)>=1
     and
     X.sfzmhm = C.sfzmhm(+)
     and
     X.sfzmhm = D.sfzmhm(+) and D.hm=B.id
     and
     A.mc = E.bh
     and
     F.sn=C.sn and F.lx=B.id!!!!!!!!!!!但是查出来结果比left join少了很多!
    你的E和F已经inter join了,肯定少了阿但按你的写法加进(+)的话报:ORA_01417:表可以外部连接到至多一个其他的表
      

  5.   


    哈哈,你是不是用的pro c啊,我前段时间也是,pro c中不支持left join,但支持+的写法。
    其实你写的已经差不多了,只是不要把left join写为inner/right join了,写的仔细点就ok了
      

  6.   


    但按你的写法加进(+)的话报:ORA_01417:表可以外部连接到至多一个其他的表
    哦,那错了,你研究好了怎么写也教教我啊
      

  7.   


    left join 子句o条件数>1的怎样先筛选再(+)呢?
    我这边也有用pro*c,但这次是为解决固化试图创建的问题,固化试图也不支持join
      

  8.   


    left join 子句o条件数>1的怎样先筛选再(+)呢?
    我这边也有用pro*c,但这次是为解决固化试图创建的问题,固化试图也不支持join
    例如:
    select *
    from x, (select id,enabled from a where a.enabled=1) y
    where x.id=y.id(+);
      

  9.   


    left join 子句o条件数>1的怎样先筛选再(+)呢?
    我这边也有用pro*c,但这次是为解决固化试图创建的问题,固化试图也不支持join
    例如:
    select *
    from x, (select id,enabled from a where a.enabled=1) y
    where x.id=y.id(+);但是这里a.enabled=1中的1不是1,而是其他表的某字段,会抱错
      

  10.   

    你必须把几个表的层次弄清楚,先连那个表再连那个表,搞清楚先后顺序后你可以通过嵌套的方式进行连接,而且code也容易看懂:
    比如:
    select * from c,(select * from a,b where a.id=b.id)t1 where c.id=t1.id(+);
    这样你一看就会很清楚执行顺序
      

  11.   


    +1,①多张表时建议用子查询,SQL结构会清晰很多。
        ②用(+)代替left outer join时要在每个关联字段都加上(+)标志否则当有NULL值时很容易产生错误数据。