Sql 使用左联接和内联接更新Teradata
我需要将下面的示例代码从mssql带到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
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
);