select t1.data data1, t2.data data2 from 
(
     select t.*, trunc((rownum - 1) / 2) x, mod(rownum - 1, 2) y from (select 1 data from dual union all select 2 data from dual union all select 3 data from dual) t
) t1 
left join 
(
     select t.*, trunc((rownum - 1) / 2) x, mod(rownum - 1, 2) y from (select 1 data from dual union all select 2 data from dual union all select 3 data from dual) t
) t2 on t1.x = t2.x
where t1.y = 0 and t2.y = 1 其中“select t.*, trunc((rownum - 1) / 2) x, mod(rownum - 1, 2) y from (select 1 data from dual union all select 2 data from dual union all select 3 data from dual) t”返回的是一个这样的结果集:
Data  X  Y
1     0  0
2     0  1
3     1  0理论上是肯定有结果的,不知道是否和rownum有关系,因为把mod(rownum - 1, 2)换成实际的整数值就会有结果

解决方案 »

  1.   

    where t1.y = 0 and t2.y = 1 
    没有符合条件的记录
    条件限制后,t1得到记录1,3;t2得到记录2,所以没有结果
      

  2.   


    select t1.data data1, t2.data data2, t1.Y Y1, t2.Y Y2 from 
    (
         select t.*, trunc((rownum - 1) / 2) x, mod(rownum - 1, 2) y from (select 1 data from dual union all select 2 data from dual union all select 3 data from dual) t
    ) t1 
    left join 
    (
         select t.*, trunc((rownum - 1) / 2) x, mod(rownum - 1, 2) y from (select 1 data from dual union all select 2 data from dual union all select 3 data from dual) t
    ) t2 on t1.x = t2.x返回结果:
    data1   data2   y1      y2
    2 1 1 0
    1 1 0 0
    2 2 1 1
    1 2 0 1
    3 3 0 0对这个结果再进行一次子查询,让条件y1=0,y2=1,会没有结果?
      

  3.   

    这样写才有结果select t1.*, t2.* 
    from 
    (
         select t.*, trunc((rownum - 1) / 2) x, mod(rownum - 1, 2) y from (select 1 data from dual union all select 2 data from dual union all select 3 data from dual) t
    ) t1, 
    (
         select t.*, trunc((rownum - 1) / 2) x, mod(rownum - 1, 2) y from (select 1 data from dual union all select 2 data from dual union all select 3 data from dual) t
    ) t2 
    where t1.x = t2.x(+) and t1.y = 0 and t2.y = 1
      

  4.   

    orz... 4楼这都能想出来...不知道是否和ORACLE的查询优化有关?导致条件被优化进去和rownum进行比较了
      

  5.   

    and t1.y = 0 and t2.y = 1这是永false条件,得不出结果的。跟rownum无关啊,rownum是从1开始的所以trunc((rownum - 1) / 2)执行是有效的。
      

  6.   

    data1   data2   y1      y2
    2    1    1    0
    1    1    0    0
    2    2    1    1
    1    2    0    1
    3    3    0    0还是不明白在这个结果集里where y1=0 and y2=1为什么是永false的条件?
      

  7.   

    而且如果把t1 t2这段先create table as的话,把表名代入原SQL是完全正确的(即是是LEFT JOIN)。因此希望知道为何用(+)这种写法才行,会加分,谢谢。
      

  8.   


    (+)放在左边就是left join 放在右边就是right join
      

  9.   

    8i:   
        
      create   table   dali.test1(a   int,b   int);   
      create   table   dali.test2(a   int,b   int);   
        
      insert   into   dali.test1   values(1,456);   
      insert   into   dali.test1   values(2,427);   
      insert   into   dali.test2   values(1,45456);   
      insert   into   dali.test2   values(3,45656);   
        
      ---内连接   
      select   *   from   dali.test1   a,   dali.test2   b   where   a.a=b.a;   
        
      ---左连接   
      select   *   from   dali.test1   a,   dali.test2   b   where   a.a=b.a(+);   
        
      ---右连接   
      select   *   from   dali.test1   a,   dali.test2   b   where   a.a(+)=b.a;   
        
      ---完全连接   
      select   *   from   dali.test1   a,   dali.test2   b   where   a.a=b.a(+)   
      union   
      select   *   from   dali.test1   a,   dali.test2   b   where   a.a(+)=b.a;   
        
      ---迪卡尔   
      select   *   from   dali.test1,   dali.test2;
    '==================================================================
    9i和sqlserver一样   left   join,right   join,full   join
      

  10.   

    我的意思是,为什么写left join不行,写(+)就行
      

  11.   


    SQL> select t1.data data1, t2.data data2 from
    (
         select t.*, trunc((rownum - 1) / 2) x, mod(rownum - 1, 2) y from (select 1 data from dual union all select 2 data from dual union all select 3 data from dual) t
    ) t1
    left join
    (
         select t.*, trunc((rownum - 1) / 2) x, mod(rownum - 1, 2) y from (selec  2  t 1 data from dual union all select 2 data from dual union all select 3   3  data from dual) t
    ) t2 on t1.x = t2.x
    where t1.y = 0 and t2.y = 1
      4    5    6    7    8    9   10
    SQL> /     DATA1      DATA2
    ---------- ----------
             1          2SQL> select * from v$version;BANNER
    ----------------------------------------------------------------
    Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod
    PL/SQL Release 10.2.0.1.0 - Production
    CORE    10.2.0.1.0      Production
    TNS for Linux: Version 10.2.0.1.0 - Production
    NLSRTL Version 10.2.0.1.0 - ProductionSQL>有结果的,楼主是9i的某个版本吧,可能是小bug
    避免起来也方便,用+,而不用left join就行了
      

  12.   


    Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production
    PL/SQL Release 9.2.0.1.0 - Production
    CORE 9.2.0.1.0 Production
    TNS for 32-bit Windows: Version 9.2.0.1.0 - Production
    NLSRTL Version 9.2.0.1.0 - Production可能真的是9i的bug,我同事说10g上确实可以。结帖 -_-