2011-04-30 104 views
7

我试图从2个表SQL查询帮助从两个表中

获取非匹配记录对于前

TableA 
ID   Account 
1    Acc1 
2    Acc2 
3    Acc3 

TableB 
Opp   Accountid 
Opp1   1 
Opp2   2 
Opp3   4 

获取非匹配的记录,我需要知道哪些ACCOUNTID这是目前在表B,但在TableA中不可用。很高兴有人能解释你将如何处理这个查询。

需要的记录将tableB的的Opp3

感谢

Prady

回答

8
create table #one (id int,acc nvarchar(25)) 
insert into #one (id , acc) values(1,'one') 
insert into #one (id , acc) values(2,'two') 
insert into #one (id , acc) values(3,'three') 

create table #two (acct nvarchar(25),ids int) 
insert into #two (acct,ids) values('one',1) 
insert into #two (acct,ids) values('two',3) 
insert into #two (acct,ids) values('four',4) 

select ids from #two EXCEPT select id from #one 

drop table #one 
drop table #two 

测试这一项

4
SELECT B.Accountid 
    FROM TableB AS B 
    LEFT 
    JOIN TableA AS A 
    ON A.ID = B.Accountid 
    AND A.ID IS NULL; 

LEFT JOIN意味着需要从第一个表中的所有行 - 如果有第一个加入不匹配条件,表B的结果表列将为空 - 这就是它工作的原因。

+0

我想你的意思是'左外部连接'。 – Oded 2011-04-30 07:16:44

+4

OUTER是一个标准的,但可选的关键字。 – 2011-04-30 07:22:46

+0

添加外连接有什么区别吗? – Prady 2011-04-30 07:23:44

1

试试这个,你有两个表中提到

上面的查询选择IDS从#two只不过选择ID在相同的列数

(select * from t1 
except 
select * from t2) 

union 

(select * from t2 
except 
select * from t1) 

思维从#one 将只从#two给你非匹配的行。它会忽略#one

2
SELECT B.Accountid 
FROM TableB AS B 
LEFT JOIN TableA AS A ON A.ID = B.Accountid 
WHERE A.ID IS NULL 
+0

这与David Fells给出的答案完全相同。 – mrt 2015-06-03 07:35:26

+1

@mrt其实不是。 David Fells的答案由于缺少where关键字而不起作用。 – 2015-07-22 23:35:50

+1

@Steve圣山羊,你是对的。我道歉! – mrt 2015-07-24 09:25:03