【问题标题】:Why does the Inner Join query not work while multi where clause does为什么内部联接查询不起作用而多 where 子句起作用
【发布时间】:2015-05-08 09:14:30
【问题描述】:

假设我经营着一家畸形的汽车公司。假设我有下表: car_engine_mileage_counters 这是从car_enginesmileage_counters 的连接表,还存储mileage 的计算字段 还可以说,我在 engine template 的工厂中对发动机组级别的系数进行了编码。

UPDATE car_engine_mileage_counters
SET mileage = mileage_counters.mileage * coefficients.coefficient
FROM car_engines
INNER JOIN engine_templates
ON car_engines.template_id = engine_templates.id
INNER JOIN mileage_counters
ON mileage_counters.id = car_engine_mileage_counters.mileage_counter_id
INNER JOIN mileage_counter_templates
ON mileage_counter.template_id = mileage_counter_templates.id
INNER JOIN coefficients
ON coefficients.mileage_counter_template_id = mileage_counter_templates.id
WHERE coefficients.engine_template_id = engine_template.id AND car_engines.id = car_engine_mileage_counters.engine_id;

这个(显然是虚构的)示例失败了:

错误:对表的 FROM 子句条目的引用无效 “car_engine_mileage_counters” 第 7 行:开 mileage_counters.id = car_engine_mileage_counters... ^ 提示:表“measure_instances_question_instances”有一个条目,但无法引用 来自查询的这一部分。

在单个FROM 子句中枚举所有表,并使用WHERE AND 代替所有INNER JOINs 但是工作正常。

我的问题是,为什么?内部连接查询有什么问题?我该如何解决?有关系吗?

【问题讨论】:

  • 您不能在第 7 行的 car_engine_mileage_counters 上执行连接子句,因为它不是您的 from 子句的一部分。
  • 向目标表(以及所有源表...)添加别名是最简单的解决方案。它还将增加可读性,恕我直言。

标签: sql postgresql join postgresql-9.3


【解决方案1】:
UPDATE cem
SET mileage = mileage_counters.mileage * coefficients.coefficient
FROM car_engine_mileage_counters cem
INNER JOIN car_engines 
ON car_engines.id = cem.engine_id
INNER JOIN engine_templates
ON car_engines.template_id = engine_templates.id
INNER JOIN mileage_counters
ON mileage_counters.id = cem.mileage_counter_id
INNER JOIN mileage_counter_templates
ON mileage_counter.template_id = mileage_counter_templates.id
INNER JOIN coefficients
ON coefficients.mileage_counter_template_id = mileage_counter_templates.id
WHERE coefficients.engine_template_id = engine_template.id AND car_engines.id = cem.engine_id;

【讨论】:

    猜你喜欢
    • 2023-03-21
    • 2019-07-12
    • 2018-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-06
    • 2023-03-07
    • 2017-11-13
    相关资源
    最近更新 更多