使用左连接和内连接更新 Teradata

Teradata update with left join and inner join

我需要将以下示例代码从 mssql 导入到 Teradata。请让我知道如何转换 it.Sample 代码 -

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

虽然丑陋,但应该可以。您可以使用派生的 table.

绕过 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 状况。尽管如此,还有一个选择:

Update table1
FROM (
  select table1.id, 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
) src
SET table1.name = src.name
WHERE table1.id = src.id

您只需将原始源查询移动到 "src" 子查询并从中更新。只需确保在 "src" 查询中每个 table1.id 值只有一行,这样就不会出现 target row updated by multiple source rows 错误。

我认为 not exists 处理你的逻辑更好:

Update table1
    set table1.name = null
    where not exists (select 1
                      from table2 join
                           table3 
                           on table2.id = table3.id
                      where table2.id = 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 
                     );