select a.aa
        a.bb
        a.cc
        b.aa
        from a left join b where a.aa=b.aa
        where a.aa='1'
              b.dd='2'
     为何查出来的是内联接的信息而不是左联接的信息,如果把b.dd='2'去掉就是左联接的信息了,但数据又不符合要求了。
请高手帮看一看如何解决。

解决方案 »

  1.   

    where a.aa='1' 应该是左连接,只是显示a中所有aa='1' 的记录,并非显示a表所有记录。
      

  2.   

    select a.aa 
            a.bb 
            a.cc 
            b.aa 
            from a left join b on a.aa=b.aa 
            where  b.dd='2' 
    把a表中的数据都定为a=1了  还怎么显示所有呢   如果想显示所有  去掉之
      

  3.   

    select a.aa 
            a.bb 
            a.cc 
            b.aa 
            from a left join b on a.aa=b.aa         where  b.dd='2'
                   and a.cc='2'
    如果符合左边表,而不符合右边表信息的记录,则只显示左表信息。
    此时如果去掉b.dd='2'则能查出信息,但不符合条件了。
      

  4.   

    测试了下,确实如你所说。貌似变成
    SELECT a.aa,a.bb,a.cc FROM a WHERE a.cc='2'

    SELECT b.aa FROM b WHERE b.dd='2'
    之间的内连接了。估计如你所说,左连接不能加右边表的过滤条件。
    通力,可以测试是否右连接时不能加左边表过滤条件。顺便说说替代方案,仅供参考。
    SELECT * FROM
       (SELECT a.aa,a.bb,a.cc FROM a WHERE a.cc='2') t1 LEFT JOIN
       (SELECT b.aa FROM b WHERE b.dd='2') t2
    ON t1.aa=t2.aa;麻烦是麻烦了些,不过可以出正确结果。具体原因,有代进一步研究。
      

  5.   

    楼上是对的,下面这样写也可以
    select a.aa 
            a.bb 
            a.cc 
            b.aa 
            from a left join b on (a.aa=b.aa and b.dd='2' )
            where a.aa='1'