Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何在Oracle中使用CTE更新表_Sql_Oracle_Oracle12c - Fatal编程技术网

Sql 如何在Oracle中使用CTE更新表

Sql 如何在Oracle中使用CTE更新表,sql,oracle,oracle12c,Sql,Oracle,Oracle12c,作为Sql server中的一个示例,我可以这样轻松地实现: WITH cte_person AS ( SELECT PersonalIdentificationNumber, PersonName FROM Employee ) UPDATE Person SET Person.PersonName = cte.PersonName FROM cte_person cte WHERE Person.PersonalIdentificationNumber = cte.Per

作为Sql server中的一个示例,我可以这样轻松地实现:

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语句中。

您可以使用MERGE语句进行此操作-

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

您可以为此使用MERGE语句-

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

Oracle不允许直接更新CTE,而SQL Server允许直接更新CTE。如果我正确理解了您的需求,那么您希望根据匹配的ID,使用Employee表中的名称更新Person表中的名称。在Oracle中实现这一点的一种方法是使用相关子查询

更新人员p SET Name=从员工e中选择e.姓名 其中e.PersonalIdentificationNumber=p.PersonalIdentificationNumber;
Oracle不允许直接更新CTE,而SQL Server允许直接更新CTE。如果我正确理解了您的需求,那么您希望根据匹配的ID,使用Employee表中的名称更新Person表中的名称。在Oracle中实现这一点的一种方法是使用相关子查询

更新人员p SET Name=从员工e中选择e.姓名 其中e.PersonalIdentificationNumber=p.PersonalIdentificationNumber;
那么,当您询问如何在更新中使用CTE时,那么:

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


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

好吧,当您在更新中询问如何使用CTE时,那么:

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


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

Oracle不允许使用这种语法。请提供示例数据、所需结果,并解释代码的作用。请注意:您的代码也不是有效的SQL Server代码,因此完全不清楚您试图执行的操作。Oracle不允许使用这种语法。请提供示例数据、所需结果,并解释代码的作用。请注意:您的代码也不是有效的SQL Server代码,因此完全不清楚您想做什么。很高兴看到您答案的最后一行。这意味着很多。而在这种情况下,Ankit的答案确实更简单。问题是如何具体使用CTE,不幸的是他没有这样做。我很高兴你花时间仔细阅读了这个问题,我会测试一下,如果它能像预期的那样工作,并且没有更清晰的语法,你也会得到答案。很高兴看到你答案的最后一行。这意味着很多。而在这种情况下,Ankit的答案确实更简单。问题是如何具体使用CTE,不幸的是他没有这样做。我很高兴你花时间仔细阅读了这个问题,我会测试一下,如果它能像预期的那样工作,并且没有更清晰的语法,你也会得到答案。谢谢你的贡献。我指出Oracle不支持这种语法,但问题是如何使用CTE。感谢您的贡献。我指出Oracle不支持此语法,但问题是如何使用CTE。感谢您的贡献,但我已经知道合并语法本身。问题是如何使用CTE实现这一点。问题是如何使用CTE实现这一点。我很好奇在有更好的解决方案时使用CTE的立场。谢谢你的贡献,但我已经知道合并语法本身。问题是如何使用CTE实现这一点。问题是如何使用CTE实现这一点。当有更好的解决方案时,我对使用CTE的立场感到好奇。
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;