2011-04-30 139 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