Teradata:使用join和if子句更新表值

时间:2016-09-19 10:00:50

标签: sql teradata

我正在开发一个Teradata系统,其中我有两个表,AppleA& BallBApple有2列primId(integer)updateValue(INteger)B只有primId(integer)。我要做的是,在A.primId=B.primId时,将updateValue=1其他设置为0

Table Apple:
Columns : Primary-key primId(Integer)
Other Columns : updateValue-(Integer)

Table Ball :
Columns : Primary-key primId(INteger)

到目前为止我的查询:

update apple from apple a, ball b set updatevalue=1 where a.primId=b.primId;

我收到的查询错误无效,我还没有其他条款。你能帮忙的话,我会很高兴。

5 个答案:

答案 0 :(得分:0)

请避免使用隐式连接语法(以逗号分隔)并使用适当的连接语法:

UPDATE apple a
LEFT JOIN ball b
 ON(a.primId=b.primId)
SET updatevalue= CASE WHEN b.primId is NULL THEN 0 ELSE 1 END ;

答案 1 :(得分:0)

请你试试这个:

UPDATE a 
FROM apple a
LEFT JOIN ball b ON a.id = b.id
SET a.updatevalue = CASE WHEN b.id > 0 THEN 1 ELSE 0 END

答案 2 :(得分:0)

此查询是您问题的直接翻译:

update apple
    set updatevalue = (case when exists (select 1 from ball b where apple.primId = b.primId)
                            then 1 else 0
                       end);

答案 3 :(得分:0)

你快到了。你只需要改变别名。

update a
from apple a
left outer join ball b 
on a.primId=b.primId
set updatevalue= (case when b.primId is not null then 1 else 0 end) ;

试试这个。

答案 4 :(得分:0)

Teradata在更新中不支持外部联接,但您可以在FROM:

中执行此操作
UPDATE apple
FROM
 (
   SELECT a.primId, CASE WHEN b.primId IS NULL THEN 0 ELSE 1 END AS x
   FROM apple AS a
   LEFT JOIN ball AS b
     ON a.primId = b.primId
 ) AS src
SET upDateValue = src.x
WHERE apple.primId = src.primId

可能效率更高:

UPDATE apple
SET upDateValue
  = COALESCE((SELECT 1 FROM ball WHERE ball.primId = apple.primId),0);

但恕我直言,性能最佳的解决方案将是多语句请求(MSR)中的两个更新:

UPDATE apple
SET upDateValue = 1
WHERE EXISTS
 ( SELECT 1 FROM ball b WHERE apple.primId = b.primId)
;UPDATE apple
SET upDateValue = 0
WHERE updatevalue <> 1;