PostgreSQL 11.16中如何筛选不同版本间列数据类型的差异
问题分析与解决
你的SQL语句逻辑完全偏离需求,问题出在这几点:
DISTINCT ON (column_name, data_type)是对列名+数据类型的组合去重,它会把同一列、同一类型的重复记录合并,但你要找的是同一列在两个版本中类型不同的记录,这个逻辑不匹配。- 原语句没有做版本间的对比关联,只是简单合并D1、D2的记录后去重,无法精准筛选出类型变更的列。
正确的解决方法
方法1:自连接直接对比版本差异
通过将表自身连接,关联同一列名的D1和D2版本记录,筛选出类型不同的结果:
-- 获取变更列的两个版本类型对比 SELECT d1.column_name, d1.versionsnummer AS d1_version, d1.data_type AS d1_data_type, d2.versionsnummer AS d2_version, d2.data_type AS d2_data_type FROM mytable d1 JOIN mytable d2 ON d1.column_name = d2.column_name AND d1.versionsnummer = 'D1' AND d2.versionsnummer = 'D2' WHERE d1.data_type != d2.data_type;
如果需要获取变更列的两条原始记录,可以用子查询先定位变更列,再取出对应数据:
-- 获取变更列的两个版本原始记录 SELECT * FROM mytable WHERE column_name IN ( SELECT d1.column_name FROM mytable d1 JOIN mytable d2 ON d1.column_name = d2.column_name AND d1.versionsnummer = 'D1' AND d2.versionsnummer = 'D2' WHERE d1.data_type != d2.data_type ) AND versionsnummer IN ('D1', 'D2');
方法2:分组筛选多类型列
先分组统计每个列在D1、D2版本中的不同类型数量,筛选出数量大于1的列(即类型变更的列),再取出对应记录:
SELECT column_name, versionsnummer, data_type FROM mytable WHERE versionsnummer IN ('D1', 'D2') AND column_name IN ( SELECT column_name FROM mytable WHERE versionsnummer IN ('D1', 'D2') GROUP BY column_name HAVING COUNT(DISTINCT data_type) > 1 );
内容的提问来源于stack exchange,提问作者mr_noob
相关产品推荐
相关产品推荐

