【问题标题】:Teradata SQL Table Joining with Keys with Different Formats使用不同格式的键连接 Teradata SQL 表
【发布时间】:2018-09-24 07:54:37
【问题描述】:

我有一个数据格式问题,我使用了来自两个不同表的帐户级标识符 (accno) 连接,它最初在 FLOAT 类型错误中给出了精度错误。

select rcv.Product, rcv.accno, rcv.date,
            bfv.Prod_class_cd, bfv.acc_appsys_id, acc_co_no
from FINAL_RECOVERY rcv
inner join RTL_EXPSR_MTRL bfv
    on rcv.accno = bfv.accno and rcv.date = bfv.date
where rcv.Product is null
order by rcv.date;

所以我尝试将 accno 转换为其他各种格式,但仍然没有成功。

on cast(rcv.accno as int) = cast(bfv.accno as int) and rcv.date = bfv.date

on cast(rcv.accno as decimal(12,0)) = cast(bfv.accno as decimal(12,0)) and rcv.date = bfv.date

on cast(rcv.accno as char) = cast(bfv.accno as char) and rcv.date = bfv.date

将它们转换为整数或小数会给我溢出错误消息,如果我转换为字符,我会用完假脱机空间。铸造是我在这里唯一的选择吗?您对如何解决此问题有何建议?

【问题讨论】:

  • 我的建议?修复数据,使键的类型正确。

标签: sql join casting overflow teradata


【解决方案1】:

当您收到 float 精度错误时,您似乎有一个数字列和一个 VarChar,其中包含超过 15 位数字。

-- INTEGERs only got up to 10 digits = less than 15 = numeric overflow
cast(rcv.accno as int) = cast(bfv.accno as int)
-- decimal(12,0) got 12 digits = less than 15 = numeric overflow
cast(rcv.accno as decimal(12,0)) = cast(bfv.accno as decimal(12,0))
-- cast as char = cast as CHAR(1) = Teradata silently truncating to a single digit
-- = join is similar to a Cross Join = no more spool space
cast(rcv.accno as char) = cast(bfv.accno as char)

保持数字列不变,并将另一列转换为相同的数据类型。这将起作用,除非您有错误数据,然后使用TO_NUMBER(accno) 或 TD15.10 的TRYCAST,两者都将为错误数据返回 NULL,从而排除该行。

【讨论】:

  • 谢谢。目前不在 TD15.10 上,但 to_number 似乎可以解决这个问题。
猜你喜欢
  • 1970-01-01
  • 2021-10-01
  • 1970-01-01
  • 2020-09-29
  • 2020-05-19
  • 2020-09-24
  • 2013-10-13
  • 2021-08-09
  • 1970-01-01
相关资源
最近更新 更多