Sql 如何在Oracle中使用CTE更新表
作为Sql server中的一个示例,我可以这样轻松地实现: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
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;