Sql 使用左联接和内联接更新Teradata

Sql 使用左联接和内联接更新Teradata,sql,join,sql-update,teradata,Sql,Join,Sql Update,Teradata,我需要将下面的示例代码从mssql带到Teradata。请告诉我如何转换。示例代码- Update table1 set table1.name = table3.name from table1 inner join table2 on table2.id = table1.id left join table3 on table2.id = table3.id where table3.name is null 这很难看,但这应该行得通。通过使用派生表,您可以绕过Teradata

我需要将下面的示例代码从mssql带到Teradata。请告诉我如何转换。示例代码-

Update table1
set table1.name = table3.name 
from table1 
inner join table2 
on table2.id = table1.id 
left join table3 
on table2.id = table3.id where table3.name is null

这很难看,但这应该行得通。通过使用派生表,您可以绕过Teradata在更新中不允许外部联接的问题

update table1
from table1,
(select <column list> from table2 left join table3 on table2.id = table3.id) t
set ...
where
table1.id = t.id
and t.name is null

与前面提到的其他内容一样,您应该检查NULL条件。然而,这里还有一个选择:

更新表1 从…起 选择table1.id,table3.name 来自表1 内连接表2 在table2.id=table1.id上 左连接表3 在table2.id=table3.id上,其中table3.name为null src 设置table1.name=src.name 其中table1.id=src.id
您只需将原始源查询移动到src子查询中并从中进行更新。只需确保在src查询中,每个table1.id值只有一行,这样就不会因为多个源行错误而更新目标行。

我认为最好通过“不存在”来处理您的逻辑:

这并不完全是您的查询所指定的-当table2中没有匹配项时,这将更新table1.name。如果这是一个问题,您可以执行以下操作:

update table1
    set table1.name = null
    where exists (select 1
                  from table2
                  where table2.id = table3.id
                 ) and
          not exists (select 1
                      from table2 join
                           table3 
                           on table2.id = table3.id
                      where table2.id = table1.id 
                     );

为什么在where子句中有table3.name为null?您正在更新中使用它。为什么不在集合中使用显式null?本质上,我希望左连接后的所有不匹配值都更新为null。我认为我们需要在from子句中也包括table1,否则其给出错误代码3993非法使用别名name@AswinKs如果你解决了这个问题,那么……看来我没有足够的声誉来接受这个答案:我认为你应该能够接受这个答案,而不是用你现在的声誉来投票。
update table1
    set table1.name = null
    where exists (select 1
                  from table2
                  where table2.id = table3.id
                 ) and
          not exists (select 1
                      from table2 join
                           table3 
                           on table2.id = table3.id
                      where table2.id = table1.id 
                     );