2009-07-08 99 views
3

我想從SQL兩條表取不匹配的記錄,表結構如下:如何從兩個SQL表中獲取不匹配的記錄?

表1

Id  Name 
1  Prashant 
2  Ravi 
3  Gaurav 
5  Naween 
7  Sachin 

表2

Id  Name 
1  Prashant 
2  Ravi 
4  Alok 
6  Raja 

我想輸出是

Id  Name 
3  Gaurav 
4  Alok 
5  Naween 
6  Raja 
7  Sachin 

會是怎樣的查詢來獲取所需要的O utput在SQL?

+0

今天沒有他不在! – TheVillageIdiot 2009-07-08 07:18:33

回答

9

我覺得joeslice的答案只會給一半的結果。你需要聯合其他表。或者,你可以做一個完整的外連接。

select a.Id, a.Name from Table1 a left outer join Table2 b on a.Name = b.Name where b.Id is null 
UNION ALL 
select a.Id, a.Name from Table2 a left outer join Table1 b on a.Name = b.Name where b.Id is null 
+0

+1感謝您指出我的錯誤。 – joeslice 2009-07-08 07:11:09

+0

我猜想,這是不夠好,加入對ID列,而不是姓名 – van 2009-07-08 07:13:05

+3

請記住,這是不是一個完整的外部聯接更加昂貴。 – 2009-07-08 07:25:09

1
select a.Id, a.Name 
from Table1 a 
left outer join Table2 b 
on a.Name = b.Name 
where b.Id is null 

編輯:我的答案是錯誤的....它會給你從表1中未表2只發現結果。感謝您指出了這一點。

+3

這個查詢只能給從表1不在表2中的記錄。問題要求在兩張表中都有不匹配的記錄。 – 2009-07-08 07:06:11

1

既然你想從兩個表中得到匹配的記錄,我認爲你會需要兩個查詢(每個表),這將是聯合在一起:

(SELECT t1.Id, t1.Name 
FROM Table1 as t1 
LEFT OUTER JOIN Table2 as t2 on t1.Name = t2.Name 
WHERE t2.Id is null) 
UNION 
(SELECT t2.Id, t2.Name 
FROM Table2 as t2 
LEFT OUTER JOIN Table1 as t1 on t2.Name = t1.Name 
WHERE t1.Id is null) 
2
SELECT * FROM 
(
    SELECT * FROM Table1 
MINUS 
    SELECT * FROM Table2 
) 
UNION 
(
    SELECT * FROM Table2 
MINUS 
    SELECT * FROM Table1 
) 

SELECT * FROM 
Table1 a 
FULL OUTER JOIN 
Table2 b 
ON 
a.ID=b.ID AND a.Name=b.NAME 
WHERE 
a.ID IS NULL OR b.ID IS NULL 
+0

對於單個選擇的第二個解決方案+1。 – 2009-07-08 07:16:23

5
create table #t1 (Id int, name varchar(50)) 
create table #t2 (Id int, name varchar(50)) 

insert #t1 values (1,  'Prashant') 
insert #t1 values (2,  'Ravi') 
insert #t1 values (3,  'Gaurav') 
insert #t1 values (5,  'Naween') 
insert #t1 values (7,  'Sachin') 

insert #t2 values (1,  'Prashant') 
insert #t2 values (2,  'Ravi') 
insert #t2 values (4,  'Alok') 
insert #t2 values (6,  'Raja') 

select isnull(#t1.id, #t2.id), isnull(#t1.name,#t2.name) from #t1 
full outer join #t2 on #t1.id = #t2.id 
where #t2.Id is null or #t1.id is null 

結果:

 
3 Gaurav 
5 Naween 
7 Sachin 
4 Alok 
6 Raja 
2
select t.ID, t.Name from Table1 t 
    left outer join Table2 tt 
    ON tt.name = t.name 
    where tt.id is null 

    union all 

    select t.ID, t.Name from Table2 t 
    left outer join Table1 tt 
    ON tt.name = t.name 
    where tt.id is null 
3

實際上,你可以使用一個查詢做到這一點:

SELECT  COALESCE(table1.ID, table2.ID) AS ID, 
      COALESCE(table1.Name, table2.Name) AS Name 
FROM  table1 
FULL JOIN table2 
     ON table1.ID = table2.ID 
WHERE  table1.ID IS NULL OR table2.ID IS NULL 

將導致:

ID   Name 
----------- -------- 
3   Gaurav 
5   Naween 
7   Sachin 
6   Raja 
4   Alok 
3
Select Id, Name 
from Table1 
where Id not in (select Id from Table2) 
UNION 
Select Id, Name 
from Table2 
where Id not in (select Id from Table1) 
相關問題