【问题标题】:In Teradata 16.20 is there a way to update or merge from two CTEs?在 Teradata 16.20 中,有没有办法从两个 CTE 更新或合并?
【发布时间】:2020-10-16 10:20:34
【问题描述】:

在 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来做到这一点?

【问题讨论】:

  • 我不知道我是否过于挑剔,但在您的 Teradata 查询中,您没有 CTE,您有一个派生表。无论如何,我认为 Teradata 只支持单个“表”作为源表(using 表)。您可以通过在该派生表中执行所有联接等来解决此问题。
  • 好的,那么我会研究替代方案。手册上说 WITH 只能与 SELECT 一起使用,所以如果 MERGE with USING 仅限于单个派生表,我就不走运了。这不是 Teradata 第一次令人失望。

标签: sql teradata teradata-sql-assistant


【解决方案1】:

您不能在派生表中使用 WITH (CTE)(这是上面 MERGE 语句的 USING 子句中的内容),但您可以使用嵌套派生表:

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;

【讨论】:

    猜你喜欢
    • 2014-08-04
    • 2017-12-11
    • 1970-01-01
    • 1970-01-01
    • 2021-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-06
    相关资源
    最近更新 更多