【问题标题】:Teradata : Update table values with join and if clauseTeradata:使用 join 和 if 子句更新表值
【发布时间】:2016-09-20 02:40:43
【问题描述】:

我正在开发一个 Teradata 系统,其中我有 2 个表,AppleABallBApple 有 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;

我收到一个无效的查询错误,而且我还没有 else 子句。你能帮忙的话,我会很高兴。

【问题讨论】:

  • Teradata 真的支持 UPDATE FROM 吗?

标签: sql teradata


【解决方案1】:

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);

但恕我直言,性能最佳的解决方案将是 Multi Statement Request (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;

【讨论】:

    【解决方案2】:

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

    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 ;
    

    【讨论】:

    • 我收到一个错误,a 和 left 之间缺少一些东西。
    【解决方案3】:

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

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

    【讨论】:

    • b 在哪里声明?
    • 更新失败 3771,case 表达式的 when 子句中的非法表达式是我得到的。任何想法? select 1 语句是否正确,或者应该是 select primId 而不是 select 1。
    • @WeareBorg 。 . .这是非常标准的 SQL。我希望 Teradata 接受它。
    • 没有,有什么想法吗?因为 teradata 似乎没有标准的 SQL 语法。
    【解决方案4】:

    你能试试这个吗:

    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
    

    【讨论】:

    • 我回答迟了,没有注意到你的。对不起
    • 我收到一个错误,a 和 left 之间缺少一些东西。
    • 我想比较a.id=b.id,而不是b.id大于0的情况。
    • 它在连接中进行比较,大小写仅用于根据匹配和未匹配的数据返回0和1。
    • @WeareBorg,请使用更新后的版本,希望它能按预期工作。
    【解决方案5】:

    你快到了。您只需要更改别名即可。

    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) ;
    

    试试这个。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-19
      • 1970-01-01
      • 2012-08-26
      相关资源
      最近更新 更多