【问题标题】:How to update data with 3 join from table?如何使用表中的 3 个连接更新数据?
【发布时间】:2018-11-14 18:14:41
【问题描述】:

我有一个任务要做:更新表 Employees 中的 commission_pct(取决于表 Departments)并满足以下条件:备注 - Max Salary 可以从表 Jobs 中获得。

部门名称-commission_pct

  • 管理 - Max_Salary * 5%

  • 营销 - Max_Salary * 10%

  • 采购 - Max_Salary * 15%
  • 财务 - Max_Salary * 25%
  • 运费 - Max_Salary * 15%
  • IT - Max_Salary * 25%

这是EMPLOYEES 表:

这是DEPARTMENTS 表:

这是JOBS 表:

我已经写了这个查询:

SELECT 
    DEPARTMENTS.DEPARTMENT_ID, DEPARTMENTS.DEPARTMENT_NAME, 
    JOBS.MAX_SALARY
FROM 
    EMPLOYEES
INNER JOIN 
    DEPARTMENTS ON EMPLOYEES.DEPARTMENT_ID = DEPARTMENTS.DEPARTMENT_ID 
INNER JOIN 
    JOBS ON EMPLOYEES.JOB_ID = JOBS.JOB_ID
         AND DEPARTMENT_NAME IN ('Administration', 'Marketing',
                                 'Purchasing', 'Finance',
                                 'Shipping', 'IT')
GROUP BY 
    DEPARTMENTS.DEPARTMENT_NAME, DEPARTMENTS.DEPARTMENT_ID, JOBS.MAX_SALARY

这个查询的结果是这样的:

我不知道如何更新它,我对如何更新特定部门感到困惑。

【问题讨论】:

  • 我无法理解这个问题。您能否尝试澄清一下或给出最终预期输出的示例

标签: sql sql-server database sql-server-2008


【解决方案1】:

您需要运行带有inner joinupdate 语句,如下所示:

update e
set commission_pct = 
case when d.DEPARMENT_NAME = 'Administration' THEN j.MAX_SALARY * 0.05
when d.DEPARMENT_NAME = 'Marketing' THEN j.MAX_SALARY * 0.1
when d.DEPARMENT_NAME = 'Purchasing' THEN j.MAX_SALARY * 0.15
when d.DEPARMENT_NAME = 'Finance' THEN j.MAX_SALARY * 0.25
when d.DEPARMENT_NAME = 'Shipping' THEN j.MAX_SALARY * 0.15
when d.DEPARMENT_NAME = 'IT' THEN j.MAX_SALARY * 0.25
else 0
end

from Employees as e
inner join department as d on e.DEPARTMENT_ID = d.DEPARTMENT_ID
inner join jobs as j on e.JOB_ID = j.JOB_ID

这将留下一个NULL,其中员工的JOB_ID 未列在JOBS 表中。

【讨论】:

    【解决方案2】:

    由于聚合,更新查询看起来有点不同。您需要在子查询或 CTE 中处理它:

    update j
        set min_salary = ed.min_salary,
            max_salary = ed.max_salary
        from jobs j join
             (select e.job_id, min(e.salary) as min_salary, max(e.salary) as max_salary
              from employees e join
                   departments d
                   on d.department_id = e.department_id
              where d.department_name in ('Administration', 'Marketing', 'Purchasing',
                                          'Finance', 'Shipping', 'IT'
                                         )
              group by e.job_id
             ) ed;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-11
      • 2021-12-11
      • 1970-01-01
      • 1970-01-01
      • 2021-04-02
      • 1970-01-01
      相关资源
      最近更新 更多