Обновление Teradata с левым и внутренним соединением - PullRequest
0 голосов
/ 08 октября 2019

Мне нужно перенести приведенный ниже пример кода из 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

Ответы [ 3 ]

1 голос
/ 08 октября 2019

Это ужасно, но это должно сработать. Вы можете обойти 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
0 голосов
/ 10 октября 2019

Я думаю, что ваша логика лучше обрабатывается 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 
                     );

Это не точно , что указывает ваш запрос - это обновит table1.name, когда нетсовпадение в table2. Если это проблема, вы можете сделать:

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 
                     );
0 голосов
/ 08 октября 2019

Как и другие упомянутые, вы должны проверить ваше состояние 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 ошибок.

...