繁体   English   中英

如何使用 Oracle 中的 CTE 更新表

[英]How to update a table using a CTE in Oracle

作为 Sql 服务器中的示例,我可以像这样轻松地实现这一点:

WITH cte_person AS
(
     SELECT PersonalIdentificationNumber, PersonName
     FROM Employee
)
UPDATE Person
SET Person.PersonName = cte.PersonName
FROM cte_person cte
WHERE Person.PersonalIdentificationNumber = cte.PersonalIdentificationNumber

但是我如何在 Oracle 中专门使用 CTE 实现这一点,或者不支持这一点? 我四处寻找并没有找到令人满意的答案。 大多数似乎都将 CTE 包含在内联 select 语句中。

Oracle 不允许直接更新 CTE(与允许它的 SQL 服务器不同)。 如果我正确理解您的要求,您希望根据匹配的 ID 使用Employee表中的名称更新Person表中的名称。 在 Oracle 中执行此操作的一种方法是使用相关子查询。

UPDATE Person p
SET Name = (SELECT e.Name FROM Employee e
            WHERE e.PersonalIdentificationNumber = p.PersonalIdentificationNumber);

好吧,当您询问如何在UPDATE中使用 CTE 时,然后:

update person p set
  p.name = (with cte_person as
              (select personalidentificationnumber, name
               from employee
              )
            select c.name
            from cte_person c
            where c.personalidentificationnumber = p.personalidentificationnumber
           )
  where exists (select null
                from employee e
                where e.personalidentificationnumber = p.personalidentificationnumber
               );

不过, merge稍微简单一些,因为您不必另外检查要更新的行(请参阅update示例中的exists子句):

merge into person p
  using (with cte_person as
              (select personalidentificationnumber, name
               from employee
              )
         select c.personalidentificationnumber,
                c.name
         from cte_person c
        ) x
  on (p.personalidentificationnumber = x.personalidentificationnumber)
  when matched then update set 
    p.name = x.name;        

但是,这可以简化 - 请参阅 Ankit 发布的代码(但是 - 正如我所说 - 如果您想知道如何使用 CTE,那么就是这样)。

您可以为此使用 MERGE 语句 -

MERGE INTO Person p
USING Employee e
ON (p.PersonalIdentificationNumber = e.PersonalIdentificationNumber)
WHEN MATCHED THEN
             UPDATE
                SET p.Name = e.Name;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM