多级SQL JOIN关联多表查询返回零结果,求正确查询逻辑
问题排查与SQL修正
原SQL错误点
- 表名拼写错误:业务表为
tasks,原SQL中误写为taks - 关联逻辑错误:子查询中取出的是
userid,却直接和user表的username字段做等值匹配,两个字段含义、取值完全不同,无法命中任何匹配结果 - 关联链断裂:主查询的
state表没有和嵌套的用户关联子查询建立关联条件,相当于独立的两个结果集无规则拼接,无法得到有效结果 - 字段引用错误:原
state表的运行时长字段为running time,原SQL错误引用了不存在的exec_time字段;队列时长字段如果未提前做下划线重命名,原字段带空格需要特殊处理 - 嵌套JOIN语法不规范:没有明确声明嵌套子查询和主表的关联关系,大部分数据库无法识别该写法
正确关联逻辑
四张表的关联链路如下:
state表和config表通过class字段关联state表和tasks表通过taskid字段关联tasks表和user表通过userid字段关联
如果需要保留state表中没有对应任务/用户的记录,可将INNER JOIN替换为LEFT JOIN。
修正后SQL
SELECT u.username, c.confname, s.state, -- 注意原表队列时间字段名带空格,部分数据库需要写成`s."queue time"` s."queue time"/1000000 || ' sec' AS queue_time, -- 原表运行时间字段为running time,替换原错误的exec_time s."running time"/1000000 || ' sec' AS running_time FROM state s INNER JOIN config c ON s.class = c.class INNER JOIN tasks t ON s.taskid = t.taskid INNER JOIN "user" u ON t.userid = u.userid
注意:
user是大部分数据库的保留关键字,作为表名使用时需要加引号转义。
内容的提问来源于stack exchange,提问作者TheDataGuy
相关产品推荐
相关产品推荐

