【问题标题】:informix update from other table with multi joins使用多连接从其他表更新 informix
【发布时间】:2016-11-14 11:22:19
【问题描述】:

以下查询似乎不起作用并给出语法错误:

update const_acad_record
set const_acad_record.education_level = school_category_type.education_level
FROM school_category_type, sch_rec sch_rec
where const_acad_record.organization_ID = sch_rec.id and
sch_rec.ctgry = school_category_type.code

如果我将其转换为子查询,如下所示,它可以工作,但更新的记录数量超过了要求:

update const_acad_record
set education_level = (SELECT education_level
FROM school_category_type sct, sch_rec sr
where const_acad_record.organization_ID = sr.id and
sr.ctgry = sct.code)

(列education_level来自表school_category_type。)

【问题讨论】:

  • Informix 语法手册不包括第一种形式;没有理由认为它会起作用。

标签: informix


【解决方案1】:

您通常还需要语句级别的WHERE 子句,以将更新的记录数限制为具有匹配条目的记录数。我认为在这个例子中,它可以采取以下形式:

UPDATE const_acad_record
   SET education_level = (SELECT education_level
                            FROM school_category_type sct
                            JOIN sch_rec sr
                              ON sr.ctgry = sct.code
                           WHERE const_acad_record.organization_ID = sr.id)
 WHERE EXISTS(SELECT education_level
                FROM school_category_type sct
                JOIN sch_rec sr
                  ON sr.ctgry = sct.code
               WHERE const_acad_record.organization_ID = sr.id)

未经测试的 SQL

这会将行更新限制为有匹配记录的行。在没有语句级 WHERE 子句的情况下,表 (const_acad_record) 中的所有行都会更新,而那些与 SELECT 中没有匹配条目的行将设置为 NULL

如果我更好地理解这些表,我可能会在语句级查询中使用 IN 子句,例如:

UPDATE const_acad_record
   SET Education_Level = (SELECT education_level
                            FROM school_category_type sct
                            JOIN sch_rec sr
                              ON sr.ctgry = sct.code
                           WHERE const_acad_record.organization_ID = sr.id)
 WHERE Organization_ID IN (SELECT sr.id
                             FROM school_category_type sct
                             JOIN sch_rec sr
                               ON sr.ctgry = sct.code)

未经测试的 SQL

除其他问题外,尚不清楚列education_level是来自表school_category_type还是表sch_rec;这可能会改变什么是合适的。

【讨论】:

  • 感谢乔纳森的快速回复。 school_category_type 中的education_level 已更新。如果是这种情况,哪个是最好的查询?问候马诺哈尔
  • 检查查询计划,但我希望 IN 变体更好。通常……
猜你喜欢
  • 2012-06-11
  • 2016-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多