2010-10-20 56 views
4

我已经浏览了所有相关的问题,但他们没有一个完全符合我的需求。我有两个相同结构的表(id,VoucherNbr,BalanceInit) - 一个来自我们当前的生产系统(tableA),另一个来自客户端的遗留系统(tableB)。表A有记录a,b,c,d,e(例如),表B有a,b,c,d,e,f,g。表B将始终具有表A中存在的所有值,但也有额外的行。我需要返回一个结果集,其中包含表B中不存在的所有行(使用示例中的f和g)。我该怎么做?如何比较两个相同表中的行并返回缺少行的结果集?

编辑:

表A

ID | VoucherNbr   | BalanceInit 
============================================= 
1 | 1111111111111111 | 25.00 
2 | 2222222222222222 | 50.00 
3 | 3333333333333333 | 10.00 

表B

ID | VoucherNbr   | BalanceInit 
============================================= 
15 | 1111111111111111 | 25.00 
17 | 1212121212121212 | 15.00 
22 | 2222222222222222 | 50.00 
34 | 3333333333333333 | 25.00 
41 | 3232323232323232 | 75.00 

我需要得到的回复是只含有不表A中存在的行一个结果,这是VoucherNbr字段中不存在的值,而不是ID字段。

ID | VoucherNbr   | BalanceInit 
============================================= 
17 | 1212121212121212 | 15.00 
41 | 3232323232323232 | 75.00 

回答

8

有些数据库提供此功能直接用减法或减法运算。 MySQL似乎没有任何这样的操作。

我可能会做这样的:

SELECT B.id, B.voucherNbr, B.balanceInit FROM tableB B 
    WHERE NOT EXISTS 
    (SELECT * FROM tableA A 
     WHERE A.voucherNbr = B.voucherNbr AND A.balanceInit = B.balanceInit) 

然而,这里有一对夫妇的其他MySQL解决方案(我用Google搜索他们),你可以测试速度:

SELECT id, voucherNbr, balanceInit FROM tableB 
    WHERE (voucherNbr, balanceInit) NOT IN 
     (SELECT voucherNbr, balanceInit FROM tableA); 

SELECT id, voucherNbr, balanceInit 
    FROM tableB LEFT JOIN tableA USING (voucherNbr, balanceInit) 
     WHERE tableA.voucherNbr IS NULL 

老实说,我喜欢如果执行时间相似或更好,则首先使用Google搜索解决方案比我自己的解决方案更好。

注意:我修改了这些来自我的原始答案,以反映您在其他答案的评论中声明两个表中的ID有所不同。

+0

谢谢,第二个为我工作。 – EmmyS 2010-10-20 02:32:38

1

注:假设id是两个表的PK。

SELECT B.* FROM TableB B 
LEFT OUTER JOIN TableA A 
ON B.id = A.id 
WHERE A.id IS NULL 

编辑:基于从OP进一步commments,由于ID是用于在两个表中的相同的行不同,假定匹配的标准是基于比较所述2列的值

SELECT B.* FROM TableB B 
LEFT OUTER JOIN TableA A 
ON B.VoucherNbr = A.VoucherNbr 
AND B.BalanceInit = A.BalanceInit 
WHERE A.VoucherNbr IS NULL 

EDIT2如果只凭单编号本身就足够了,然后balanceInit也可以被丢弃

SELECT B.* FROM TableB B 
LEFT OUTER JOIN TableA A 
ON B.VoucherNbr = A.VoucherNbr 
WHERE A.VoucherNbr IS NULL 
+0

嗯,这是这类问题的。它是两个表的PK,但是每个表中的行可能不是相同的顺序。例如,在表A中,值b可能是id = 2,而在表B中,值b可能是id = 50。我猜你的查询不会工作,如果是这样的话? – EmmyS 2010-10-20 02:06:29

+0

谢谢!编辑后的版本也起作用;我在发帖时已经接受了另一个答案,所以很抱歉,您没有获得积分。 – EmmyS 2010-10-20 02:37:19

0

您可以使用INTERSECT stament

SELECT * FROM tableA 
INTERSECT 
SELECT * FROM tableB 

-EXCEPT返回从左边查询是不是也右边查询发现任何不同的值。

-INTERSECT返回由INTERSECT操作数左侧和右侧的查询返回的任何不同的值。

http://msdn.microsoft.com/en-us/library/ms188055.aspx

+2

不,实际上我不行。如果你没有注意到,这个问题被标记为MySQL,它不支持相交。这是一个MS SQL函数。 – EmmyS 2011-08-19 13:46:39

相关问题