如何筛选数据库中新增的更新行,排除未更新的旧行?
筛选数据库中带后缀的更新行方案
针对你遇到的这种数据库更新生成带-1/-2后缀ID的场景,我整理了几个实用的查询方案,帮你快速筛选出更新后的行,排除原始旧行:
1. 基础筛选:直接匹配带连字符的ID
如果你的需求只是排除没有后缀的原始行(比如ID为1的旧行),保留所有带-数字后缀的更新行,最简单的方式是用字符串匹配:
MySQL / MariaDB
SELECT * FROM your_table WHERE id LIKE '%-%';
PostgreSQL
SELECT * FROM your_table WHERE strpos(id, '-') > 0;
SQL Server
SELECT * FROM your_table WHERE CHARINDEX('-', id) > 0;
这个方法快速直接,但如果ID里可能出现其他连字符(比如非后缀的情况),就需要更精准的匹配。
2. 精准匹配:确保后缀是数字
如果要严格筛选数字-数字格式的更新行(避免误匹配其他带连字符的ID),可以用正则表达式:
MySQL / MariaDB
SELECT * FROM your_table WHERE id REGEXP '^[0-9]+-[0-9]+$';
PostgreSQL
SELECT * FROM your_table WHERE id ~ '^[0-9]+-[0-9]+$';
SQL Server
SELECT * FROM your_table WHERE PATINDEX('^[0-9]+-[0-9]+$', id) > 0;
这个正则表达式确保ID以数字开头,中间是连字符,后面跟着数字,完全匹配你描述的更新行格式。
3. 进阶需求:取每个原始ID的最新更新行
如果你的需求是每个原始ID只保留最新的更新行(比如ID1的行里,只保留1-2而排除1和1-1),可以通过提取原始ID前缀,分组后取最大后缀的行:
MySQL / MariaDB
SELECT t.* FROM your_table t INNER JOIN ( -- 提取原始ID前缀,找到每个前缀对应的最大ID(因为后缀数字越大越新) SELECT SUBSTRING_INDEX(id, '-', 1) AS original_id, MAX(id) AS latest_id FROM your_table WHERE id LIKE '%-%' GROUP BY SUBSTRING_INDEX(id, '-', 1) ) latest ON t.id = latest.latest_id;
PostgreSQL
WITH ranked_updates AS ( SELECT *, -- 按原始ID分组,按后缀数字倒序排名 ROW_NUMBER() OVER ( PARTITION BY SPLIT_PART(id, '-', 1) ORDER BY CAST(SPLIT_PART(id, '-', 2) AS INT) DESC ) AS rn FROM your_table WHERE strpos(id, '-') > 0 ) SELECT * FROM ranked_updates WHERE rn = 1;
SQL Server
WITH ranked_updates AS ( SELECT *, ROW_NUMBER() OVER ( PARTITION BY LEFT(id, CHARINDEX('-', id) - 1) ORDER BY CAST(RIGHT(id, LEN(id) - CHARINDEX('-', id)) AS INT) DESC ) AS rn FROM your_table WHERE CHARINDEX('-', id) > 0 ) SELECT * FROM ranked_updates WHERE rn = 1;
这个方案会帮你自动筛选出每个原始ID对应的最新更新行,适合需要追踪最新数据的场景。
内容的提问来源于stack exchange,提问作者anon
相关产品推荐
相关产品推荐

