使用左连接和内连接更新 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
);
我需要将以下示例代码从 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
);