select (表A).字段2 from (表A) right join (select语句得到的一个表,有207条数据) as (表B) on  表A.字段1 = 表B.字段1 where 表A.字段1 = '20110926'符合条件的表A中的数据有66条,这条sql得到的结果也是66条。但是既然我用的right join,那么结果就应该是表B中的207条数据,为什么只有66条呢?补充一下,如果没有那个where子句,表A中符合条件的数据有1万多条,但是我要找的是当天的数据,所以加的这个条件。
我想要的结果是,如果表A中字段2当天有数据,那么显示,如果没有就为空。但是现在它只显示出了有值的数据

解决方案 »

  1.   

    你把 where 改为 and 试一下
      

  2.   

    /*
    标题:SQL中on条件与where条件的区别
    作者:爱新觉罗·毓华 
    时间:2008-07-14
    地点:新疆乌鲁木齐
    */数据库在通过连接两张或多张表来返回记录时,都会生成一张中间的临时表,然后再将这张临时表返回给用户。 
    在使用left jion时,on和where条件的区别如下:1、on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录。2、where条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有left join的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉。假设有两张表:表1:tab1 
    id size 
    1  10 
    2  20 
    3  30 
    表2:tab2 
    size name 
    10   AAA 
    20   BBB 
    20   CCC 两条SQL:
    1、select * from tab1 left join tab2 on tab1.size = tab2.size where tab2.name='AAA'
    2、select * from tab1 left join tab2 on tab1.size = tab2.size and tab2.name='AAA'第一条SQL的过程:
    1、中间表
    on条件: 
    tab1.size = tab2.size 
    tab1.id tab1.size tab2.size tab2.name 
    1 10 10 AAA 
    2 20 20 BBB 
    2 20 20 CCC 
    3 30 (null) (null) 
    2、再对中间表过滤
    where 条件:
    tab2.name='AAA'
    tab1.id tab1.size tab2.size tab2.name 
    1 10 10 AAA 第二条SQL的过程:
    1、中间表
    on条件: 
    tab1.size = tab2.size and tab2.name='AAA'
    (条件不为真也会返回左表中的记录) tab1.id tab1.size tab2.size tab2.name 
    1 10 10 AAA 
    2 20 (null) (null) 
    3 30 (null) (null) 
     
    其实以上结果的关键原因就是left join,right join,full join的特殊性,
    不管on上的条件是否为真都会返回left或right表中的记录,full则具有left和right的特性的并集。 
    而inner jion没这个特殊性,则条件放在on中和where中,返回的结果集是相同的。
      

  3.   


    -- test1表有一个字段a;值为1-4,; test2有两个字段a、b,a为3-6,b的值交替为‘a',’b'
    select a.a, b.a from test1 a right join (select * from test2) b on b.a = a.a
    where b.b = 'a';select a.a, b.a from test2 a right join (select * from test1) b on b.a = a.a
    where a.b = 'a';外关联有主表和从表之分,where里面应该是主表的值关联,可以吧条件“表A.字段1 = '20110926'
    ”放在子查询里
      

  4.   

    楼主先弄清
    on过滤条件和where过滤条件的区别
      

  5.   

    207条数据再通过where条件过滤不就66条了。
      

  6.   

    试试这个sql的呢:
    select (表A) .字段2
      from (表A)
     (select语句得到的一个表,有207条数据) as(表B) 
     WHERE  表A.字段1 (+)= 表B.字段1
     and  表A.字段1 = '20110926'
      

  7.   

    select (表A) .字段2
      from (表A)
     (select语句得到的一个表,有207条数据) as(表B)  
     WHERE 表A.字段1 (+)= 表B.字段1
     and 表A.字段1 = '20110926'
      

  8.   


     --建议用这种写法
    select (表A) .字段2
      from (表A)
     (select语句得到的一个表,有207条数据) as(表B)  
     WHERE 表A.字段1 (+)= 表B.字段1
     and 表A.字段1 = '20110926'
      

  9.   


    --建议用这种写法:
    select (表A) .字段2
      from (表A)
     (select语句得到的一个表,有207条数据) as(表B)  
     WHERE 表A.字段1 (+)= 表B.字段1
     and 表A.字段1 = '20110926'
      

  10.   

    where里面应该是主表的值关联,可以吧条件“表A.字段1 = '20110926'”放在子查询里,这个只是提高它的效率,跟这里面的问题没点关系。
    LZ:“select (表A).字段2 from (表A) right join (select语句得到的一个表,有207条数据) as (表B) on 表A.字段1 = 表B.字段1 where 表A.字段1 = '20110926'”
    (select语句得到的一个表,有207条数据)这里面有207条记录,如果不加where 表A.字段1 = '20110926'子句得出来的结果应该是207条,但得出来的结果做where条件过滤,出来的结果就不一定是207条了
      

  11.   

    (select语句得到的一个表,有207条数据-->结果207条
    select (表A).字段2 from (表A) right join (select语句得到的一个表,有207条数据) as (表B) on 表A.字段1 = 表B.字段1---->结果207条
     where 表A.字段1 = '20110926' 条件过滤的结果就末必是207条