在三个表之间使用Update和Join

时间:2013-07-11 19:29:27

标签: sql join sql-update

我在rails应用程序中有一个数据库,链接如下: 有人知道它的学校知道它的学校规则。

我正在尝试编写一个在Person中创建CanDoThis列的迁移,并使用School Rules中相关的IsThisAllowed列填充它。 这是我到目前为止,但它给了我一个“表名”school_rules“指定不止一次”错误。

UPDATE people
  SET people.canRunInHalls = school_rules.RunningInHallsIsAllowed 
  FROM school_rules
  JOIN school_rules on school_rules.school_id = schools.id 
  JOIN schools ON schools.id = people.school_id;

尝试了一些新内容 - 收到此错误:错误:对表“people”的FROM子句条目的无效引用

提示:表“people”有一个条目,但不能从查询的这一部分引用它。

UPDATE people
  SET people.canRunInHalls = school_rules.RunningInHallsIsAllowed 
  FROM schools s
  JOIN school_rules on school_rules.school_id = s.id 
  JOIN schools ON schools.id = people.school_id;

编辑:尝试绘制架构

people
-------------
id
school_id
canRunInHalls


schools
_______________
id
people
school_rules_id


school_rules
_______________
id
school_id
RunningInHallsIsAllowed

2 个答案:

答案 0 :(得分:1)

尝试使用更好的别名:

UPDATE p
  SET canRunInHalls = sr.RunningInHallsIsAllowed 
  FROM people p
  INNER JOIN school_rules sr ON p.school_id = sr.school_id;

由于您实际上并不需要学校的任何内容,我将其从声明中删除。

作为警告,我认为你会遇到很多人的麻烦。由于学校可以有很多规则,因此您不清楚哪个学校规则将适用于该人。您可能需要聚合school_rules,或使用一些描述符将其限制为1行。

答案 1 :(得分:0)

@Bill可能是对的。但是,仅供参考,如果你确实需要在SQL语句中多次引用一个表,你应该像这样对它们进行别名:

FROM school_rules sr1
JOIN school_rules sr2 on ...