查询从两个表中选择不匹配的记录

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

【讨论】:

以上是关于查询从两个表中选择不匹配的记录的主要内容,如果未能解决你的问题,请参考以下文章

从两个表中查询数据,只选择修改过的记录

MySQL触发器:更新一张表中的记录,其中同一行中的记录匹配选择查询

从两个表中选择不匹配的列值

MySQL Query Join 从两个表中选择不匹配的行

MySQL 从具有重复引用条目的联合表中选择唯一记录

如何使用 MySQL 连接语句选择与链接表中的多个值匹配的记录?