本帖最后由 sniffer12345 于 2009-12-07 13:38:12 编辑

解决方案 »

  1.   

    select * from 
      table_A 
      left outer join 
      talbe_B on (table_A.col_01=table_B.col_01) 
      left outer join 
      table_C on (table_B.col_02=table_C.col_02); 这样不就行了
      

  2.   


    这里是左外连接 按照这种写法的话 将 table_A当源表了 而题意中 table_B.col_02=table_C.col_02(+)这里  table_B是源表哦。。
      

  3.   

     select * from table_B left  join table_A on table_A.col_01=table_B.col_01 left join table_C on table_B.col_02=table_C.col_01;
      

  4.   

    汗。。左连接 就是以左边的表为基准 简单地举例 就是 左边的表若有空记录的话 那么结果集中依旧存在 这是区别于inner join 的 相对的还有右连接,,
    由于万恶的postgre或者说万恶的oracle不遵守SQL92 所以现在移植存储过程改惨我了 这个问题 以前从没细想过。。现在仔细一想 头真大 虽然用存储过程能绕过去 但还是想彻底搞清楚。。
      

  5.   

    刚刚试验过了 总算把问题弄懂了 为避免误导他人。。将试验的结果写下oraclemch说用右外连接 我咋一想 就认为这样select * from 
    table_A
    left outer join talbe_B on table_A.col_01=tahle_B.col_01
    right outer join table_C on table_B.col_02=table_C.col_02但我建了三个表 并插入数据后(其中每个表都保持有空数据)
    结果发现跟原查询不对等
    后来想想 试了下 wildwave说的
    select * from
      table_A
      left outer join
      talbe_B on (table_A.col_01=table_B.col_01)
      left outer join
      table_C on (table_B.col_02=table_C.col_02);
    却发现对等 我就迷糊了 就找了找一开始自己写的程序 后来才发现是自己程序中就有错误
    直接两个 left outer join就行了。我仔细想了想,大概就是 
      table_A
      left outer join
      talbe_B on (table_A.col_01=table_B.col_01)
    这里生成了一个A*B的结果,然后 table_C on (table_B.col_02=table_C.col_02);这里不是A跟C连的,是A*B里边B的所属字段在跟C连哎 学艺不精 还是老老实实仔细看书去。。给分 结贴。。