注意:因为不能保证 tb1 里面的 年、月、ClerkID 的内容始终比 tb2 里面多。
也就是说,有可能 1999年3月 tb2 里面有一条记录,而 tb1 里面没有记录,而
2000年 4月 tb1 里面有4条记录而 tb2 里面没有。所以不能用 tb1 left outer join tb2 来生成结果。因为这样的结果不可靠。

解决方案 »

  1.   

    select * from tb1 a left join tb2 b on a.InClerkID=b.OutClerkID and a.InMonth=b.OutMonth and a.InYear=b.OutYear
      

  2.   

    select * from tb1 a left join tb2 b on a.InClerkID=b.OutClerkID and a.InMonth=b.OutMonth and a.InYear=b.OutYear
      

  3.   

    select a.*,isnull(b.OutClerkID,0) OutClerkID,isnull(b.OutMonth,0) OutMonth,isnull(b.OutYear,0) OutYear,isnull(b.TotalOut,0) TotalOut from tb1 a left join tb2 b on a.InClerkID=b.OutClerkID and a.InMonth=b.OutMonth and a.InYear=b.OutYear
      

  4.   

    如果使用 left outer join 的话,可以通过下面的查询来生成上述报表:SELECT tb1.InClerkID, 
          tb1.InMonth, 
          tb1.InYear, 
          tb1.TotalIn, 
          tb2.OutClerkID, 
          tb2.OutMonth, 
          tb2.OutYear, 
          tb2.TotalOut
    FROM tb1 left outer JOIN
          tb2 on
         tb1.InClerkID = 
          tb2.OutClerkID and 
         tb1.InMonth = 
          tb2.OutMonth and
         tb1.InYear = 
          tb2.OutYear但是正如上面所说的,这个结果并非总是可靠的。
      

  5.   

    pengdali(大力 V2.0):你在上面那个方法仍然需要改进。因为再这两个表里面不能保证 tb1 里面的记录始终是最丰富的。 如果通过这样的简单的 Left outer join 的话,将可能丢失掉 tb2 里面的那些
     在 tb1 当中没有对应的 ClerkID,Month,和 Year 的记录。现在的需求是再出现 Left outer join 的结果的同时,还希望 tb2 里面的那些
     在 tb1 当中没有对应的 ClerkID,Month,和 Year 的记录 也能够显示出来。而对应的 tb1 里面的字段部分显示为 Null 或者是 0. 如果 right join 一样
      

  6.   

    select * from (select * from tb1 a left  join tb2 b on a.InClerkID=b.OutClerkID and a.InMonth=b.OutMonth and a.InYear=b.OutYear) t1 union 
    select * from (select * from tb1 a right join tb2 b on a.InClerkID=b.OutClerkID and a.InMonth=b.OutMonth and a.InYear=b.OutYear) t2 使用 UNION 运算符组合多个结果
    UNION 运算符使您得以将两个或多个 SELECT 语句的结果组合成一个结果集。使用 UNION 组合的结果集都必须具有相同的结构。而且它们的列数必须相同,并且相应的结果集列的数据类型必须兼容。
    UNION 的结果集列名与 UNION 运算符中第一个 SELECT 语句的结果集中的列名相同。另一个 SELECT 语句的结果集列名将被忽略。默认情况下,UNION 运算符从结果集中删除重复的行。如果使用 ALL 关键字,那么结果中将包含所有行并且将不删除重复的行。 
      

  7.   

    InClerkID  InMonth    InYear     TotalIn    OutClerkID OutMonth   OutYear    TotalOut   
    ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- 
    NULL       NULL       NULL       NULL       10         6          2003       565       
    13         1          2003       11091      13         1          2003       -3434     
    13         2          1988       10         NULL       NULL       NULL       NULL
    13         4          2003       1111       NULL       NULL       NULL       NULL
    9          3          2003       -100       9          3          2003       -200      (所影响的行数为 5 行)
      

  8.   

    tb1
    InClerkID  InMonth    InYear     TotalIn    
    ---------- ---------- ---------- ---------- 
    13         2          1988       10        
    13         1          2003       11091     
    9          3          2003       -100      
    13         4          2003       1111   
    tb2
    OutClerkID OutMonth   OutYear    TotalOut   
    ---------- ---------- ---------- ---------- 
    13         1          2003       -3434     
    9          3          2003       -200      
    10         6          2003       565
      

  9.   

    用一个临时表吧!
    select InClerkID,InMonth, InYear, TotalIn into #temp from tb1insert into #temp(InClerkID,InMonth, InYear)
        select OutClerkID,OutMonth, OutYear from tb2
        where cast(OutClerkID as varchar)+'-'
             +cast(OutMonth as varchar)+'-'
             +cast(OutYear as varchar) not in
             (select cast(InClerkID as varchar)+'-'
                    +cast(InMonth as varchar)+'-'
                    +cast(InYear as varchar) from tb1)select a.*,isnull(b.OutClerkID,0) OutClerkID,isnull(b.OutMonth,0) OutMonth,isnull(b.OutYear,0) OutYear,isnull(b.TotalOut,0) TotalOut
        from #temp a left join tb2 b
        on a.InClerkID=b.OutClerkID and a.InMonth=b.OutMonth and a.InYear=b.OutYear
      

  10.   

    你改成full join就OK了:
    select a.*,isnull(b.OutClerkID,0) OutClerkID,isnull(b.OutMonth,0) OutMonth,isnull(b.OutYear,0) OutYear,isnull(b.TotalOut,0) TotalOut from tb1 a full join tb2 b on a.InClerkID=b.OutClerkID and a.InMonth=b.OutMonth and a.InYear=b.OutYear
      

  11.   

    对啊,怎么忘记这个东西了.FULL [OUTER]指定在结果集中包含左表或右表中不满足联接条件的行,并将对应于另一个表的输出列设为 NULL。这是对通常由 INNER JOIN 返回的所有行的补充。说明  按此处指定的方法指定外联接或在 WHERE 子句中使用旧式非标准的 *= 和 =* 运算符都是可行的。不能在同一语句中同时使用这两种方法。