多表JOIN场景下如何正确编写含多个SELECT字段的SQL语句?
双JOIN场景下的SQL编写修正方案
错误原因分析
- SELECT子句语法错误:新增字段时重复写了
select关键字,SQL中SELECT语句仅需在开头声明一次,后续查询字段用逗号分隔即可。 - 子查询结构混乱:错误地将第二个JOIN放到了WHERE子句的子查询中,且子查询里出现了重复的
FROM关键字,导致语法逻辑混乱。主表的关联JOIN应该放在主查询的FROM部分,而非用于获取max(gen_id)的子查询里。
修正后的SQL语句
select org.catalog_truck.plate_number as "Госномер грузовика", org.catalog_field.name as "Поле погрузки", shift_id as "ID смены", trip_id as "ID рейса", core.monitoring_stages.* -- 明确指定表的所有字段,避免多表字段冲突 from core.monitoring_stages join org.catalog_truck on core.monitoring_stages.vehicle_id = org.catalog_truck.catalog_truck_id join org.catalog_field on core.monitoring_stages.field_id = org.catalog_field.catalog_field_id -- 若实际关联字段为name,可替换为原写法 where gen_id = ( SELECT max(gen_id) FROM core.monitoring_tripmachine_generation WHERE ready=true and timerange_from > '2024-09-23 00:00:00.000 +0300' and timerange_to < '2024-09-23 23:59:59.000 +0300' ) ORDER by dtstart
关键修正说明
- 移除了SELECT子句中多余的
select关键字,所有查询字段用逗号分隔。 - 将第二个JOIN移至主查询的FROM部分,与主表
core.monitoring_stages直接关联,符合多表JOIN的语法逻辑。 - 明确指定
core.monitoring_stages.*来获取主表所有字段,避免多表JOIN后字段名冲突(若多个表有同名字段,直接写*会导致歧义)。 - 修正了子查询的结构,子查询仅负责获取符合条件的最大
gen_id,无需关联其他表。
内容的提问来源于stack exchange,提问作者mascai
相关产品推荐
相关产品推荐

