如何从两个SQL表中获取不匹配的记录?

如何从两个SQL表中获取不匹配的记录?,sql,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

我想从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
在SQL中获取所需输出的查询是什么

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中找到的结果。谢谢你指出这一点。

我认为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

由于您希望从两个表中获得不匹配的记录,我认为您需要两个查询(每个表一个查询),它们将联合在一起:

(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)

结果:

3 Gaurav 5 Naween 7 Sachin 4 Alok 6 Raja 3戈拉夫 5纳文 7萨钦 4阿洛克 6拉贾
实际上,您可以通过一个查询完成此操作:

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
选择合并(t1.name,t2.name) 来自表1 t1完全外部连接表2 t2 在t1.id=t2.id上 减 选择合并(t1.name,t2.name) 来自表1 t1内部连接表2 t2
在t1.id=t2.id

首先,将两个表合并:

with data as
(
select * from t1
union
select * from t2)
select * from data 
临时产出:

    Id  name
1   1   Prashant
2   2   Ravi
3   3   Gaurav
4   4   Alok
5   5   Naween
6   6   Raja
7   7   Sachin
现在从数据中使用内部联接删除公共ID: 解决方案

with data as
    (
    select * from t1
    union
    select * from t2)
    select * from data 
    where id not in (select t1.id from t1 inner join t2 on t1.id=t2.id);
最终输出:

    Id  name
1   3   Gaurav
2   4   Alok
3   5   Naween
4   6   Raja
5   7   Sachin

此查询将只提供表1中不在表2中的记录。这个问题要求在两个表中都有不匹配的记录。我想在ID列上连接而不是在NAME+1上连接已经足够了。使用“isnull”的好技巧我必须使用Union All来完成这一点!与我的答案类似:p,但我也设法挤进了isnull:p@Sam:+1:虽然我更喜欢COALESCE:)+1 COALESCE是真正的ANSI SQL标准,ISNULL仅适用于某些数据库(如SQL Server)
FULL OUTER JOIN
在MySQL中不起作用。但是谁在乎呢,MySQL真是糟透了:)首先,我们使用完全外部连接来连接表,所以它是左外部连接和右外部连接的组合,然后我们从任意一侧给出了两个null值,这样就不会有任何列同时具有这两个null值。因此,它将返回不在另一个表中的值。是。。输出类似于null+table2值,即table2值或table1值+null,即table1值。您也可以为此使用set运算符。我只使用连接来解决这个查询。如果你想用集合来解决它,那么它将是这样的。。从t1.id=t2.id的表1 t1完全外部联接表2 t2中选择合并(t1.name,t2.name)减去从t1.id=t2.id的表1 t1内部联接表2 t2中选择合并(t1.name,t2.name);
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)
SELECT COALSCE(t1.name, t2.name) AS "name"
FROM table1 t1 FULL OUTER JOIN table2 t2
ON t1.id = t2.id
WHERE t1.name IS NULL
OR t2.name IS NULL;
with data as
(
select * from t1
union
select * from t2)
select * from data 
    Id  name
1   1   Prashant
2   2   Ravi
3   3   Gaurav
4   4   Alok
5   5   Naween
6   6   Raja
7   7   Sachin
with data as
    (
    select * from t1
    union
    select * from t2)
    select * from data 
    where id not in (select t1.id from t1 inner join t2 on t1.id=t2.id);
    Id  name
1   3   Gaurav
2   4   Alok
3   5   Naween
4   6   Raja
5   7   Sachin