如何将表中的值添加到另一个表中?

时间:2017-10-24 07:55:50

标签: sql

我有桌子。如何为工资添加奖金?

enter image description here

3 个答案:

答案 0 :(得分:2)

一般情况下

  1. 您必须加入 WorkersBonuses查询
  2. 你必须聚合奖金(如果工人有几个奖金怎么办?)。您可能希望sum增加奖金或采取最大的奖励 - max
  3. 你必须处理null - 如果工人没有任何奖金
  4. 像这样的东西

    select w.WorkerId,
           w.WorkerName,
           w.CompanyId,
           w.Salary + coalesce((select sum(b.Bonus) -- Let's sum up all worker's the bonuses
                                  from Bonuses b
                                 where b.WorkerId = w.WorkerId), 0) 
      from Workers w
    

    如果您想update现有的Workers表格,那么原则相同:

    update Workers
       set Salary = Salary + coalesce((select sum(b.Bonus)
                                         from Bonuses b
                                        where b.WorkerId = WorkerId), 0);
    

    但是,正如我可以看到WorkersBonuses之间存在一对一的关系,这就是left join会做的原因(参见< em> Wanderer的解决方案)。更好的方法是组合WorkersBonuses表:

        Worker:
    
          WorkerId 
          WorkerName,
          CompanyId,
          Salary not null,
          Bonus not null default 0 -- <- from Bonuses
    

    因此您可以将查询简单地作为

       select ...
              Salary + Bonus
         from Workers 
    

答案 1 :(得分:1)

您可以使用 JOIN

<强>查询

select t1.WorkerID, 
       t1.WorkerName, 
       t1.CompanyID, 
       t1.Salary,
       coalesce(t2.Bonus, 0) as Bonus,
       t1.Salary + coalesce(t2.Bonus, 0) as [new_salary]
  from Workers t1 left join 
       Bonuses t2 on t1.WorkerID = t2.WorkerID;
在这种情况下,

LEFT JOIN 会更好,因为如果WorkerID表中没有特定的Bonuses,那么它也会出现在结果中。< / p>

答案 2 :(得分:0)

好吧,我在一年后回答,但是我相信它将对将来的人有所帮助,我测试了以上答案,看来我可以提供另一个好的解决方案。

此查询已在 MSSQL 引擎上进行了测试。

UPDATE w SET w.Salary = w.Salary + s.Bonus FROM Workers w INNER JOIN Bonuses s ON w.WorkerID = s.WorkerID

  • w代表Worker表。
  • b代表“奖金”表。