请求:关联Sales与Transaction表,用CASE WHEN更新INDICATOR列的SQL语句
关联Transaction表更新Sales表INDICATOR列的正确SQL写法
原SQL语句的关联更新语法不符合主流数据库的规范,不同数据库的关联更新写法有差异,下面分几种常用数据库给出修正后的代码:
MySQL/MariaDB 版本
用JOIN直接关联两张表进行更新:
UPDATE Sales a JOIN Transaction t ON a.id = t.id AND a.date <= t.date SET a.indicator = CASE WHEN a.retail_value >= t.selling_price THEN 'Y' WHEN a.retail_value < t.selling_price THEN 'N' ELSE NULL END;
SQL Server 版本
调整FROM子句的位置,确保语法符合SQL Server规范:
UPDATE a SET a.indicator = CASE WHEN a.retail_value >= t.selling_price THEN 'Y' WHEN a.retail_value < t.selling_price THEN 'N' ELSE NULL END FROM Sales a INNER JOIN Transaction t ON a.id = t.id AND a.date <= t.date;
Oracle 版本
Oracle不支持UPDATE ... FROM语法,推荐用MERGE语句实现关联更新:
MERGE INTO Sales a USING Transaction t ON (a.id = t.id AND a.date <= t.date) WHEN MATCHED THEN UPDATE SET a.indicator = CASE WHEN a.retail_value >= t.selling_price THEN 'Y' WHEN a.retail_value < t.selling_price THEN 'N' ELSE NULL END;
注意事项
如果单条Sales记录对应多条Transaction记录,上面的语句会随机选取一条匹配的记录来更新。如果需要按特定逻辑(比如取每个id对应的最新Transaction记录)更新,需要额外筛选关联条件,比如通过子查询先获取每个id的最新交易日期,再关联更新。
内容的提问来源于stack exchange,提问作者ImSahil
相关产品推荐
相关产品推荐

