DB2跨表取最大时间戳用VALUES+MAX报SQL0104N错误如何解决
问题原因
报错是因为你写的VALUES子句构造和别名定义不符合DB2语法规范:你给VALUES整体多套了一层不必要的括号,同时临时表和列别名的写法不符合DB2要求。
解决方案
最优方案:使用GREATEST函数
DB2原生支持GREATEST函数,可以直接返回多个输入值的最大值,写法更简洁,执行效率也更高:
SELECT a.CUST_ID as CUSTOMER_ID, GREATEST(a.LST_UPDT_TS, b.LST_UPDT_TS, c.LST_UPDT_TS) as LST_UPDT_TS FROM TableA as a JOIN TableB as b ON b.CUST_ID = a.CUST_ID JOIN TableC as c ON c.CUST_ID = a.CUST_ID ORDER BY LST_UPDT_TS;
修正VALUES写法的方案
如果你确实需要用VALUES构造临时表的逻辑(比如后续要扩展更复杂的计算规则),修正后的写法如下:
SELECT a.CUST_ID as CUSTOMER_ID, ( SELECT MAX(LST_UPDT_TS) FROM ( VALUES (a.LST_UPDT_TS), (b.LST_UPDT_TS), (c.LST_UPDT_TS) ) AS T(LST_UPDT_TS) ) as LST_UPDT_TS FROM TableA as a JOIN TableB as b ON b.CUST_ID = a.CUST_ID JOIN TableC as c ON c.CUST_ID = a.CUST_ID ORDER BY LST_UPDT_TS;
核心修正点:
- 移除了VALUES外侧多余的总括号,每个时间戳单独用括号包裹,代表临时表的三行数据
- 临时表别名改为通用的
T,列名跟随在别名后的括号中定义,符合DB2语法规范
内容的提问来源于stack exchange,提问作者E Devitt
相关产品推荐
相关产品推荐

