PostgreSQL基于最新日期处理重复VIN行:UPDATE语句报错求助
解决UPDATE语句关联子查询的语法错误并实现重复VIN记录标记
报错原因
你使用的UPDATE ... INNER JOIN是MySQL/MariaDB专属的语法风格,若你的数据库是PostgreSQL这类不支持该语法的类型,就会触发syntax error at or near "INNER JOIN"报错。
正确实现方案
方案1:PostgreSQL兼容写法(FROM子句关联)
这是符合PostgreSQL UPDATE语法规范的写法,通过FROM子句关联子查询获取每个VIN的最新日期,再将非最新记录标记为无效:
UPDATE vin_table u SET error_status = 'y' FROM ( SELECT vin, MAX(date) AS max_date FROM vin_table WHERE m_job_id = '1c1b9440' GROUP BY vin ) t WHERE u.vin = t.vin AND u.date <> t.max_date AND u.m_job_id = '1c1b9440';
方案2:通用兼容性写法
这种写法适配大多数数据库,通过子查询筛选出每个VIN的最新记录集合,再将不在此集合内的记录标记为无效:
UPDATE vin_table SET error_status = 'y' WHERE m_job_id = '1c1b9440' AND (vin, date) NOT IN ( SELECT vin, MAX(date) FROM vin_table WHERE m_job_id = '1c1b9440' GROUP BY vin );
方案3:MySQL/MariaDB适配写法
如果你的数据库是MySQL/MariaDB,原语句报错可能是语法细节问题,调整后的可用写法如下:
UPDATE vin_table u JOIN ( SELECT vin, MAX(date) AS max_date FROM vin_table WHERE m_job_id = '1c1b9440' GROUP BY vin ) t ON u.vin = t.vin SET u.error_status = 'y' WHERE u.date != t.max_date AND u.m_job_id = '1c1b9440';
注:MySQL中INNER JOIN可简写为JOIN,<>和!=为等价的不等于运算符。
内容的提问来源于stack exchange,提问作者Devendra
相关产品推荐
相关产品推荐

