日期:2014-05-19  浏览次数:20582 次

二张相同的表找不同的数据问题
二张表结构一样,就二个字段:号码和金额
现在想找出来一张表比另外一张表多出哪些数据

表1:                                     表2
号码  金额                 号码               金额
001           1.00                 001                 1.00
001           2.00                 001                 2.00
001           2.00                 002                 1.00
002           1.00                
002           2.00
002           3.00
002           1.00
结果应该得到多出来的数据为:
号码  金额
001           2.00
002           2.00
002           3.00
002           1.00
多出四条,有直接用语句得出来的方法吗?

------解决方案--------------------
select a.*
from 表1 as a,表2 as b
where a.号码+金额 <> b.号码+金额


------解决方案--------------------
select * from 表1
where not exists(select 1 from 表2 where 表1.号码=表2.号码 and 表1.金额=表2.金额)
------解决方案--------------------
结果应该得到多出来的数据为:
号码  金额
001 2.00
002 2.00
002 3.00
002 1.00
----------

楼主说得“多”跟我们理解的不一样


------解决方案--------------------
兩表的數據的,一定是數量一一對應的嗎?

表1: 表2
号码  金额 号码 金额
001 3.00 001 1.00
001 2.00 001 2.00
001 2.00 002 1.00
002 1.00
002 2.00
002 3.00
002 1.00

如果是這種情況,A中7條數據,B中3條數據,但是查詢出來應該不是4條數據,而是5條吧。

應該A中第一條001可以對應B中兩條001的數據.
------解决方案--------------------
--創建測試環境
Create Table 表1
(ID int IDENTITY(1,1),
号码 Char(3),
金额 Numeric(10, 2))
Insert 表1 Select '001 ', 1.00
Union All Select '001 ', 2.00
Union All Select '001 ', 2.00
Union All Select '002 ', 1.00
Union All Select '002 ', 2.00
Union All Select '002 ', 3.00
Union All Select '002 ', 1.00

Create Table 表2
(ID int IDENTITY(1,1),
号码 Char(3),
金额 Numeric(10, 2))
Insert 表2 Select '001 ', 1.00
Union All Select '001 ', 2.00
Union All Select '002 ', 1.00
GO

--测试

--先找出不在表2存在的数据
select a.* from 表1 a left join 表2 b on a.号码=b.号码 and a.金额=b.金额 where b.号码 is null
union all
--再找出在表2中存在 而且有二条以上的记录并减去其中一条
select a.* from 表1 a left join 表2 b on a.号码=b.号码 and a.金额=b.金额
where a.ID not in (select min(a.ID) from 表1 a left join 表2 b on a.号码=b.号码 and a.金额=b.金额
group by a.号码,a.金额)