【问题标题】:How to update table on postgres with join statement如何使用 join 语句更新 postgres 上的表
【发布时间】:2021-05-30 15:56:35
【问题描述】:

我在 postgresql DB 上有三个表,并尝试更新表,但未能得到我想要的结果。请帮助我获得有效的结果。

第一个表是“员工”。 在此表中,“employee_id”的前三个字符表示员工类型。 例如,employee_id="AA1-11111" 是 employee_type="AA1" 的成员。

employee_id department
AA1-11111 A
AA1-22222 B
AB1-11111 A

第二个表是“评估”。 在此表中,为 (employee_type, department) 定义了评估标准。 例如,employee_type="AA1" 和 department="A" 的员工将通过assessment_criteria="XX1X" 进行评估。

employee_type department assessment_criteria
AA1 A XX1X
AA1 B XX1Y
AA2 A XX2X

第三个表是“employee_assessment”。在此表中定义了每个员工的评估标准。 (此表是由“员工”和“考核”通过夜间批处理计算得出的。)

employee_id department assessment_criteria
AA1-11111 A XX1X
AA1-22222 B XX1Y
AB1-11111 A Null

我想要做的是......当“评估”表更新时更新“employee_assessment”表。 当“评估”表如下更新时...

employee_type department assessment_criteria
AA1 A XX1X
AA1 B NEW
AA2 A Null

我想像这样更新“employee_assessment”表。

employee_id department assessment_criteria
AA1-11111 A XX1X
AA1-22222 B NEW
AB1-11111 A Null

我试过了

UPDATE
employee_assessment
SET assessment_criteria=employee_assessment.assessment_criteria
FROM employee
LEFT JOIN (SELECT employee_id, LEFT(employee_id,3) as emp_type, department as emp_department from employee) as t1
ON
employee.employee_id=t1.employee_id
and
employee.department=t1.emp_department
left join assessment
on
t1.emp_type=assessment.employee_type
and
t1.emp_department=assessment.department;

但我得到了这个结果。

employee_id department assessment_criteria
AA1-11111 A XX1X
AA1-22222 B XX1X
AB1-11111 A XX1X

我的查询似乎是错误的。

【问题讨论】:

    标签: postgresql join sql-update


    【解决方案1】:

    问题的实际原因是您的架构未正确规范化。因此,您应该通过修复和规范化您的架构来解决这个问题。然后,您可以简单地使用自动“更新”的视图。

    首先有类型和部门的表格(除非你已经有(不清楚))。

    CREATE TABLE type
                 (id serial,
                  name varchar(64),
                  PRIMARY KEY (id));
    
    CREATE TABLE department
                 (id serial,
                  name varchar(64),
                  PRIMARY KEY (id));
    

    然后,在员工表中,仅引用类型和部门。没有实际上是两列的列,即类型 id 必须有自己的列,并且不能与任何其他列连接。

    CREATE TABLE employee
                 (id serial,
                  type integer,
                  department integer,
                  given_name varchar(64),
                  surname varchar(64),
                  PRIMARY KEY (id),
                  FOREIGN KEY (type)
                              REFERENCES type
                                         (id),
                  FOREIGN KEY (department)
                              REFERENCES department
                                         (id));
    

    在评估表中也提到了类型和部门。

    CREATE TABLE assessment
                 (id serial,
                  type integer,
                  department integer,
                  name varchar(64),
                  criteria varchar(64),
                  PRIMARY KEY (id),
                  FOREIGN KEY (type)
                              REFERENCES type
                                         (id),
                  FOREIGN KEY (department)
                              REFERENCES department
                                         (id));
    

    现在您可以为员工评估创建视图,该视图连接来自其他表的数据,并且始终保持最新。不需要任何手册UPDATE

    CREATE VIEW employee_assessment
    AS
    SELECT e.id employee_id,
           e.department employee_department,
           a.criteria assessment_criteria
           FROM employee e
                LEFT JOIN assessment a
                          ON a.type = e.type
                             AND a.department = e.department;
    

    视图还有一个优点,即它不能像您现在拥有的表那样包含不一致的数据。

    【讨论】:

      猜你喜欢
      • 2013-11-10
      • 2012-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-01
      • 2012-08-26
      • 2014-01-24
      • 2021-03-28
      相关资源
      最近更新 更多