如何仅显示两条记录间的差异值?以ID_office对应记录为例
提取两条记录间的差异值解决方案
嗨,我来帮你搞定这个问题!你需要对比以ID_office区分的两条记录,只保留值不同的列并展示对应数据对吧?这里给你两种实用的处理方式:
方法一:手动指定列(适合列数较少的场景)
因为你的表列不多,直接指定需要保留的差异列就可以快速得到结果。假设你的表名为office_table,执行下面的SQL语句就能拿到你想要的结果:
SELECT ID_office, Status, Name FROM office_table WHERE ID_office IN (114574, 118451);
这个逻辑很简单:PERSONS列在两条记录中值相同(都是51),所以我们直接排除它,只查询ID_office(用来区分记录)以及值不同的Status和Name列。
方法二:自动检测差异列(适合列数较多的场景)
如果你的表有很多列,不想手动一个个判断,可以用动态SQL自动检测并提取差异列。以MySQL为例:
-- 第一步:找出所有值不同的列(排除ID_office作为唯一标识) SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = '你的数据库名' AND TABLE_NAME = 'office_table' AND COLUMN_NAME != 'ID_office' AND EXISTS ( SELECT 1 FROM office_table t1 JOIN office_table t2 ON t1.ID_office = 114574 AND t2.ID_office = 118451 WHERE t1.COLUMN_NAME != t2.COLUMN_NAME ); -- 第二步:用动态SQL查询这些差异列和ID_office SET @cols = (SELECT GROUP_CONCAT(COLUMN_NAME) FROM ( SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = '你的数据库名' AND TABLE_NAME = 'office_table' AND COLUMN_NAME != 'ID_office' AND EXISTS ( SELECT 1 FROM office_table t1 JOIN office_table t2 ON t1.ID_office = 114574 AND t2.ID_office = 118451 WHERE t1.COLUMN_NAME != t2.COLUMN_NAME ) ) AS diff_cols); SET @sql = CONCAT('SELECT ID_office, ', @cols, ' FROM office_table WHERE ID_office IN (114574, 118451)'); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
这段代码会先自动找出两条记录中值不同的列,然后动态生成查询语句,最终返回只包含差异列的两条记录,完全不用手动指定列名。
内容的提问来源于stack exchange,提问作者luana nastasi
相关产品推荐
相关产品推荐

