sql - 在 Teradata 16.20 中,有没有办法从两个 CTE 更新或合并?
问题描述
在 Teradata 16.20 中,有没有办法从两个 CTE 更新或合并?
例如,在 MSSQL 中,我们有第一个 CTE,第二个 CTE 使用第一个 CTE,然后是更新:
with CTE1 as (
select alpha, beta
from someTable a
join otherTable b on a.aleph = b.aleph
), CTE2 as (
select beta, gamma
from CTE1 c
join anotherTable d on c.alpha = d.alpha
)
update u
set u.gamma = e.gamma
from updateTable u
join CTE2 e on u.beta = e.beta;
在 Teradata 16.20 中,这当然适用于一个 CTE,如下所示:
merge into mydb.mytable
using (
select alpha, beta
from someTable a
join otherTable b on a.aleph = b.aleph
) as CTE (alpha, beta)
on mytable.alpha = CTE.alpha
when matched then update
set beta = CTE.beta;
有没有办法用两个或多个CTE 做到这一点?
解决方案
您不能在派生表中使用 WITH (CTE)(这是您在上面语句的USING
子句中所拥有的MERGE
),但您可以使用嵌套派生表:
merge into mydb.mytable u
using (
select beta, gamma
from (
select alpha, beta
from someTable a
join otherTable b on a.aleph = b.aleph
) CTE1
join anotherTable d on CTE1.alpha = d.alpha
) CTE2
on u.beta = CTE2.beta
when matched then update
set gamma = CTE2.gamma;
或者,如果MERGE
不适用(例如,连接谓词不包括所有主索引列)与加入相同的方法UPDATE
:
UPDATE u FROM mydb.mytable u,
(
select beta, gamma
from (
select alpha, beta
from someTable a
join otherTable b on a.aleph = b.aleph
) CTE1
join anotherTable d on CTE1.alpha = d.alpha
) CTE2
set gamma = CTE2.gamma
WHERE u.beta = CTE2.beta;
推荐阅读
- javascript - 无法调用 JSON 对象的第一个元素
- vba - 基于文本输入汇总摘要任务
- html - 标题内容对齐/定位
- c++11 - 对于指向 std::set 容器中用户定义类的指针,自定义比较类无法正常工作
- twitter - netbeans proyect 上的 Twitter4J 无法导入 jar 文件
- java - 仅使用整数计算 2^n%k
- python - 如何遍历python中的列表并获取每两个关闭项之间的比较值的布尔列表?
- javascript - 你好,你能帮我提高这个艺术代码的效率吗?
- php - 如何在我上传成功的 html 中显示 PHP 变量?
- node.js - 异常时电子崩溃,即使处理了 uncaughtException