如何从两个SQL表中获取不匹配的记录?
我想从SQL中的两个表中提取不匹配的记录,表结构如下: 表1如何从两个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
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