2017-08-01 73 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

相关问题