注意:因为不能保证 tb1 里面的 年、月、ClerkID 的内容始终比 tb2 里面多。
也就是说,有可能 1999年3月 tb2 里面有一条记录,而 tb1 里面没有记录,而
2000年 4月 tb1 里面有4条记录而 tb2 里面没有。所以不能用 tb1 left outer join tb2 来生成结果。因为这样的结果不可靠。
也就是说,有可能 1999年3月 tb2 里面有一条记录,而 tb1 里面没有记录,而
2000年 4月 tb1 里面有4条记录而 tb2 里面没有。所以不能用 tb1 left outer join tb2 来生成结果。因为这样的结果不可靠。
解决方案 »
- SQL group by 统计问题MIN
- 求简单的解决方法:我希望大批量导入数据时,完全不受其他事务影响,此时其他事务也不可操作(读写),只在我这个事务中简单的设置成可串
- 关于查找结果需要特殊排序的问题
- SQL Server 2K SP4 + WIN 2003 SP1 如何启用1433端口?
- SQL server数据库安装出错
- 大量数据转移
- 同步复制表的问题 (老大快出来)
- SELECT语句的结果保存问题/动态执行后的结果保存问题
- 数据库备份
- "select * into czyk from czqx where id>2"不能运行????
- 马上要叫测试版了,大家帮帮忙!!!!!!!!!!!!!!
- 这个SQL语句怎么写?高手请进,谢谢!
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但是正如上面所说的,这个结果并非总是可靠的。
在 tb1 当中没有对应的 ClerkID,Month,和 Year 的记录。现在的需求是再出现 Left outer join 的结果的同时,还希望 tb2 里面的那些
在 tb1 当中没有对应的 ClerkID,Month,和 Year 的记录 也能够显示出来。而对应的 tb1 里面的字段部分显示为 Null 或者是 0. 如果 right join 一样
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 关键字,那么结果中将包含所有行并且将不删除重复的行。
---------- ---------- ---------- ---------- ---------- ---------- ---------- ----------
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 行)
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
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
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