DB2子查询使用LEFT JOIN报错SQLCODE=-104,需实现关联查询
SQL关联表语法错误修复
问题说明
原SQL语句尝试关联MAXIMO.COMMLOG与maximo.TICKET表时触发语法错误,需求是获取每个OWNERID最新的一条记录,并关联对应的TICKETID。
原SQL代码
SELECT t.TICKETID -- the other table ,c.OWNERID ,c.CREATEDATE FROM ( SELECT * , ROW_NUMBER () OVER (PARTITION BY c.OWNERID ORDER BY c.CREATEDATE) AS RN_ FROM MAXIMO.COMMLOG c LEFT JOIN maximo.TICKET t on t.TICKETUID = c.OWNERID WHERE c.UNIQUEID = '468' AND c.OWNERID = '4355070' ) c WHERE RN_ = 1 ORDER BY c.CREATEDATE DESC
错误信息(翻译后)
SQL错误[42601]:在"c"后发现意外的符号".",预期的符号可能包括:","。SQLCODE=-104, SQLSTATE=42601, DRIVER=4.31.10
未关联表时的查询结果
| OWNERID | CREATEDATE |
|---|---|
| 16031985 | 2022-08-11-08.02.30.351000 |
期望的关联表后查询结果
| TICKETID | OWNERID | CREATEDATE |
|---|---|---|
| 123456 | 16031985 | 2022-08-11-08.02.30.351000 |
错误原因
- 子查询内部的
COMMLOG表别名c,与子查询本身的别名c重复,导致数据库解析时混淆引用对象,触发语法错误。 - 使用
SELECT *会同时查询两张表的所有字段,若存在同名字段会引发引用歧义,也会降低查询效率。
修复后的SQL代码
SELECT sub.TICKETID ,sub.OWNERID ,sub.CREATEDATE FROM ( SELECT cl.OWNERID, cl.CREATEDATE, t.TICKETID, ROW_NUMBER() OVER (PARTITION BY cl.OWNERID ORDER BY cl.CREATEDATE) AS RN_ FROM MAXIMO.COMMLOG cl LEFT JOIN maximo.TICKET t ON t.TICKETUID = cl.OWNERID WHERE cl.UNIQUEID = '468' AND cl.OWNERID = '4355070' ) sub WHERE sub.RN_ = 1 ORDER BY sub.CREATEDATE DESC
修复说明
- 修改内部
COMMLOG表的别名为cl,子查询别名为sub,彻底避免别名重复问题。 - 明确指定子查询需要返回的字段,替代
SELECT *,消除字段冲突风险,同时提升查询性能。 - 外层查询统一通过子查询别名
sub引用字段,逻辑更清晰。
内容的提问来源于stack exchange,提问作者Douglas
相关产品推荐
相关产品推荐

