合并两个表,排除相同的记录

Jos*_*sef 0 mysql sql

我有两个表:

T1 
A  
B  
C  
D

T2  
A  
B  
E  
F  
G  
Run Code Online (Sandbox Code Playgroud)

现在,我想要查询将合并这两个表但排除相同记录的查询。输出表应类似于:

T1T2 
C  
D  
E  
F  
G
Run Code Online (Sandbox Code Playgroud)

怎么做?

Luk*_*zda 5

看起来您需要FULL OUTER JOIN并且排除了公共部分。您可以使用以下方法进行模拟:

SELECT T1.col_name
FROM T1 
LEFT JOIN T2
  ON T1.col_name = T2.col_name
WHERE T2.col_name IS NULL
UNION
SELECT T2.col_name
FROM T2 
LEFT JOIN T1
  ON T1.col_name = T2.col_name
WHERE T1.col_name IS NULL;
Run Code Online (Sandbox Code Playgroud)

SqlFiddleDemo

????????????
? col_name ?
????????????
? C        ?
? D        ?
? E        ?
? F        ?
? G        ?
????????????
Run Code Online (Sandbox Code Playgroud)

更多信息:SQL联接的可视表示

在此处输入图片说明

SELECT <select_list>
FROM Table_A A
FULL OUTER JOIN Table_B B
ON A.Key = B.Key
WHERE A.Key IS NULL OR B.Key IS NULL
Run Code Online (Sandbox Code Playgroud)

不幸的MySQL是不支持,FULL OUTER JOIN所以我使用了2的并集LEFT JOIN

在此处输入图片说明

在此处输入图片说明

来自http://www.codeproject.com/Articles/33052/Visual-Representation-of-SQL-Joins的所有图像

附录

但是,如果我有两个具有不同列的不同表,但是它们都有一个相同的列,该怎么办?所使用的SELECT语句的列数不同

您可以使用其他列轻松扩展它。

SELECT 'T1' AS tab_name, T1.col_name, T1.col1, NULL AS col2
FROM  T1
LEFT JOIN  T2
  ON T1.col_name=  T2.col_name
WHERE T2.col_name IS NULL
UNION
SELECT 'T2' AS tab_name, T2.col_name, NULL, T2.col2
FROM  T2
LEFT JOIN  T1
  ON T1.col_name=  T2.col_name
WHERE T1.col_name IS NULL;
Run Code Online (Sandbox Code Playgroud)

LiveDemo

输出:

????????????????????????????????????????????????????
? tab_name ? col_name ? col1 ?        col2         ?
????????????????????????????????????????????????????
? T1       ? C        ?    3 ?                     ?
? T1       ? D        ?    4 ?                     ?
? T2       ? E        ?      ? 2016-01-03 00:00:00 ?
? T2       ? F        ?      ? 2016-01-02 00:00:00 ?
? T2       ? G        ?      ? 2016-01-01 00:00:00 ?
????????????????????????????????????????????????????
Run Code Online (Sandbox Code Playgroud)