【问题标题】:Workaround for Teradata identity columns and volatile/temp tables issueTeradata 标识列和易失性/临时表问题的解决方法
【发布时间】:2018-09-27 19:19:45
【问题描述】:

我对 Teradata 有点陌生,不明白为什么我不能在易失性表中选择标识列。执行类似以下的操作时,我收到以下错误。

create multiset volatile table Temp_Events as
  (
    select es.eventSettingId, -- this is an identity column 
           evt.lob
    from ForecastDevDW.cal_eventSettings es
    join ForecastDevDW.cal_eventTypes evt
     on evt.eventTypeId = es.eventTypeId
  )
with data
  primary index (eventSettingId)
  on commit preserve rows;

错误:CREATE TABLE AS 当前不支持标识列。

有没有办法在 Teradata 的易失性/临时表中选择标识列?此错误的任何解决方法?另外,有谁知道为什么您不能在 volatile 表中选择标识列? (我习惯了 SQL Server,这根本不是问题。)

【问题讨论】:

  • 我还没有遇到这个特殊问题。如果我不得不解决它,我会做一个 CREATE VOLATILE DDL 指定列和列类型(就像一个常规的 CREATE TABLE 语句)。然后跟进一个 INSERT INTO... SELECT 语句。也许这会被允许。
  • Teradata 不支持易失性表中的标识列,我不认为。您可以将其设为整数列并使用 row_number 或类似的方式填充它。
  • 也许,基于@Andrew 的评论SELECT CAST(es.eventSettingID as INT) as eventSettingID... ?
  • 感谢您的建议。我尝试了@JNevill 的演员想法,但收到了同样的错误。
  • 该死!我想也许我们会很幸运。我会尝试创建您的 volatile 表,然后插入其中 CREATE MULTISET VOLATILE TABLE temp_events (eventSettingID INT, evt.lob WHATEVER) ON COMMIT PRESERVE ROWS 然后 INSERT INTO temp_events <your select statement here>;

标签: teradata temp-tables identity-column


【解决方案1】:

这确实是一个奇怪的限制,即使是类型转换为 VarChar 也会失败并显示相同的错误消息。

但有一个解决方法,将 Select 放入派生表中:

create multiset volatile table Temp_Events as
  (
    select *
    from
     (
       select es.eventSettingId, -- this is an identity column 
              evt.lob
       from ForecastDevDW.cal_eventSettings es
       join ForecastDevDW.cal_eventTypes evt
         on evt.eventTypeId = es.eventTypeId
     ) as dt
  )
with data
  primary index (eventSettingId)
  on commit preserve rows;

【讨论】:

  • 这适用于您正在创建一个静态表的场景,该表是更大的一个子集。如果要向该表中添加其他数据,则必须认识到主索引不会像本机标识列那样表现。您必须从具有标识列的表中复制此解决方法,或者您必须为主索引生成代理值。
猜你喜欢
  • 1970-01-01
  • 2016-01-18
  • 2020-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-01
  • 2016-02-22
  • 1970-01-01
相关资源
最近更新 更多