查询从两个表中选择不匹配的记录
Posted
技术标签:
【中文标题】查询从两个表中选择不匹配的记录【英文标题】:query to select non matching records from two tables 【发布时间】:2018-09-04 06:34:30 【问题描述】:我有 2 个这样的表:
表 Student_Old:
id name city
1 A X
2 B Y
3 C Z
表 Student_new:
id name city
1 A X
2 M Y
3 C K
如您所见,对于 Id 2,name 不匹配,对于 Id 3,两个表中的 city 不匹配(我正在比较两个表中的主键 ID,基本上 student_new 是 old 的备份表)。现在我想得到这 2 行不匹配。 例如: student_old s1, student_new s2-
s1.id s2.id s1.name s2.name s1.city s2.city
2 2 B M X X
3 3 C C Z K
【问题讨论】:
提示:inner join
.
如果将行 (4, F, G) 添加到 student_old,预期的结果是什么?
在这种情况下,我不会在 student_new 中有这条记录,并且我正在对 Id 进行比较,所以 student_new 不会有 Id 4。我不会为其中一个中不存在的记录而烦恼表。
【参考方案1】:
由于您不关心在一个表中但不在另一个表中的记录,因此一个简单的 JOIN 就足够了:
SELECT s1.id AS old_id, s2.id AS new_id,
s1.name AS old_name, s2.name AS new_name,
s1.city AS old_city, s2.city AS new_city
FROM student_old s1
JOIN student_new s2
ON s1.id = s2.id
WHERE s1.name != s2.name OR s1.city != s2.city
输出:
old_id new_id old_name new_name old_city new_city
2 2 B M Y Y
3 3 C C Z K
【讨论】:
“我不会为表格中不存在的记录而烦恼” @jarlh Sheesh!那是在我发布后的评论中! 没错,但我在你发帖之前提出了这个问题! @jarlh,你确实做到了。我决定安全地回答答案,但现在已根据该评论对其进行了更正。感谢您提请我注意。 @jarlh :感谢您提出这一点,这帮助我获得了所需的解决方案。【参考方案2】:SELECT so.id AS id_1, so.name AS name_1, so.city AS city_1,
sn.id AS id_2, sn.name AS name_2, sn.city AS city_2
FROM student_old so
INNER JOIN student_new sn
ON so.id = sn.id
WHERE so.name <> sn.name AND so.city <> sn.city
【讨论】:
【参考方案3】:使用连接
select os.*,ns.* Student_Old os join Student_new ns on os.id=ns.id
where os.city!=ns.city OR os.name!=ns.name
【讨论】:
【参考方案4】:使用内连接和 where 子句过滤掉不匹配的名称和城市
select a.* , b.* from Student_Old inner join Student_new
on a.id=b.id
where a.name<>b.name or a.city<>b.city
【讨论】:
以上是关于查询从两个表中选择不匹配的记录的主要内容,如果未能解决你的问题,请参考以下文章