2017-08-01 68 views
0

我有兩個列表(我已經投入兩個表)之間的獨特之處:哪些字段是兩個表

  • Table1包含field1是標識符的列表,
  • Table2包含field2,是另一種標識符列表。

我想運行一個查詢,會告訴我什麼標識符是兩個表之間唯一的,即他們要麼只或Table2.field2只,而不是在無論是在Table1.field1

+1

'distinct','左加入'。這麼多選擇。你有什麼嘗試? –

+0

這是一個奇怪的近距離投票,我對一個人不同意。重新投票。 –

回答

0

一種可能的方式做到這一點:

  • 執行表之間的FULL OUTER JOIN,連接Table1.field1Table2.field2,並
  • 有一個WHERE條款,只選擇行,其中任一Table1.field1爲NULL或Table2.field2爲NULL

SELECT 
    field=ISNULL(t1.field1, t2.field2) 
FROM 
    table1 AS t1 
    FULL JOIN table2 AS t2 ON 
     t2.field2=t1.field1 
WHERE 
    t1.field1 IS NULL OR 
    t2.field2 IS NULL; 

另一種方法來做到這一點。之後的結果集上聯:

  • 其中FIELD1沒有出現在表2表1的記錄
  • 表2的
  • 記錄,其中場2沒有出現在表1

SELECT 
    field=field1 
FROM 
    table1 AS t1 
WHERE 
    NOT EXISTS(SELECT * FROM table2 AS t2 WHERE t2.field2=t1.field1) 
UNION ALL 
SELECT 
    field=field2 
FROM 
    table2 AS t2 
WHERE 
    NOT EXISTS(SELECT * FROM table1 AS t1 WHERE t1.field1=t2.field2) 
1

最簡單的解決方案是

(select * from #Table1 
except 
select * from #Table2) 
union 
(select * from #Table2 
except 
select * from #Table1) 

例如:

Create table #Table1(Field1 varchar(100)) 
Create table #Table2(Field2 varchar(100)) 

Insert into #Table1 values 
('a'),('b'),('c'),('d') 

Insert into #Table2 values 
('e'),('f'),('c'),('d') 
------------------------ 
(select * from #Table1 
except 
select * from #Table2) 
union 
(select * from #Table2 
except 
select * from #Table1) 

=>

Field1 
-------- 
a 
b 
c 
d 


Field2 
-------- 
e 
f 
c 
d 

output : 

Field1 
-------- 
a 
b 
e 
f 
1

古怪(不是最短,也許不是最簡單的任一)全基於集合的溶液:

SELECT * FROM 
(SELECT field1 
FROM Table1 
EXCEPT 
SELECT field2 
FROM Table2) R1 

UNION ALL 

SELECT * FROM 
(SELECT field2 
FROM Table2 
EXCEPT 
SELECT field1 
FROM Table1) R2 

第一結果集 - 表1

第二結果集 - 表2

第三結果集 - 輸出 - (唯一標識符 - 要麼在FIELD1僅在或僅FIELD2,而不是在兩者)

enter image description here

相關問題