【问题标题】:How to use UPDATE JOIN correctly?如何正确使用 UPDATE JOIN?
【发布时间】:2021-06-08 02:57:51
【问题描述】:

我尝试如下更新表格行:

update EMPLOYEE set Salary=Salary * 1.15 where Dno=1;

效果很好,但我想学习如何使用 UPDATE JOIN。所以我使用部门名称而不是 DNo。

我写了以下代码:

update EMPLOYEE  set Salary=e.Salary * 1.15 from EMPLOYEE e join DEPARTMENT d on e.DNo=d.DNumber  where d.DName='Headquarters';

但是上面代码的结果是 SQL 命令更新了 EMPLOYEE 表中的所有行。 我哪里做错了?

【问题讨论】:

    标签: sql join google-bigquery sql-update


    【解决方案1】:

    在 BigQuery 中,将其更改为 where 子句中的过滤器:

    update EMPLOYEE e
        set Salary = Salary * 1.15 
        where exists (select 1
                      from DEPARTMENT d 
                      where d.DNumber = e.DNo and
                            d.DName = 'Headquarters'
                     );
    

    以上是标准 SQL,应该适用于任何数据库。如果你想要一个FROM 子句,那么使用:

    update EMPLOYEE e
        set Salary = e.Salary * 1.15 
        from DEPARTMENT d 
        where d.DNumber = e.DNo and
              d.DName = 'Headquarters';
    

    有(至少)两种不同的方式在更新中实现FROM,“SQL Server 方法”和“Postgres”方法。在 SQL Server 方法中,被更新的表应该在FROM 子句中。在“Postgres 方法”中,表不能FROM 子句中。 BigQuery 遵循“Postgres 方法”。

    不过,上述方法实际上适用于两种方法。

    【讨论】:

      【解决方案2】:

      尝试在更新中使用表别名

      update Emp
      Set Salary = Emp.Salary * 1.15 
      From EMPLOYEE As Emp
      join DEPARTMENT As dep On Emp.DNo = dep.DNumber  
      Where dep.DName = 'Headquarters';
      

      【讨论】:

      • 感谢您的回复,它不起作用。 (更新 Emp 有问题)即使我添加完整的表名(更新员工),它仍然会更新所有行
      猜你喜欢
      • 2018-03-28
      • 2011-05-19
      • 2017-12-20
      • 1970-01-01
      • 2018-10-24
      • 1970-01-01
      • 2021-12-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多