sql - 从选择插入 (Teradata)

标签 sql teradata

我有以下 SQL 语句:

select  cast (count(*) as bigint) from 
(SELECT  oldtable.id,oldtable.day,newtable.newid from oldtable
left outer join newtable on oldtable.day between newtable.FROM_DAY 
and newtable.TO_DAY and oldtable.id = newtable.id) a

结果为 45 亿

但是当我这样说时:

INSERT  INTO AnotherTable
(id, day, newid)
SELECT  oldtable.id,oldtable.day,newtable.newid from oldtable
left outer join newtable on oldtable.day between newtable.FROM_DAY 
and newtable.TO_DAY and oldtable.id = newtable.id

它只插入3亿条记录(oldtable包含45亿条记录,newtable包含4.3亿条记录)。

为什么?

AnotherTable的定义:

CREATE MULTISET TABLE AnotherTable ,NO FALLBACK ,
 NO BEFORE JOURNAL,
 NO AFTER JOURNAL,
 CHECKSUM = DEFAULT,
 DEFAULT MERGEBLOCKRATIO
 (  
  id INTEGER NOT NULL,
  day DATE FORMAT 'YYYY-MM-DD',  
   newid INTEGER NOT NULL
 )
 PRIMARY INDEX ( id) 
 PARTITION BY RANGE_N(day  BETWEEN DATE '2000-09-20' AND DATE '2030-02-15' EACH INTERVAL '1' DAY );

我做了以下检查:

 SELECT oldtable.id,oldtable.day,newtable.newid from oldtable 
 left outer join newtable on oldtable.day between newtable.FROM_DAY and newtable.TO_DAY
 and oldtable.id = newtable.id 
 where newtable.newid is null 

结果是0条记录,所以根本不需要外连接,我在这里只是用它来证明记录数不同,但不应该这样

最佳答案

你从哪里得到插入的数量?

45 亿减去 3 亿约为。 42 亿。

当你精确计算缺失行数时,结果是4.294.967.296?

那么可能是由于“警告:6813 内部计数器中的数字溢出。”

从消息手册中剪切和粘贴:

6813 内部计数器中的数字溢出。返回的行数是实际返回的行数,模 2^32。 说明:当 ActivityCount 达到时,此警告消息在 SUCCESS/OK 包裹内发送 返回的(即行数)超出了当前最大限制 (2^32 - 1)。 请求成功。 返回给用户的值为:(返回的实际行数)模 2^32。

注意:如果用户知道实际返回的行数不能超过 2^33,则实际返回的行数可以如下推导: 实际返回的行数 = 2^32 + 返回给用户的值。

迪特尔

关于sql - 从选择插入 (Teradata),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16278791/

相关文章:

mysql - 集合作为 SQL 中的数据类型

MySQL:仅存储 1 个正确答案(索引)

sql - 从一组列值中识别有效的 IP

hadoop - Sqoop导入性能改善

mysql - 如何在 SQL/Teradata 中创建宏变量?

mysql - 需要帮助查询关系表中未使用的 ID

sql - 是否可以根据条件以两种不同的方式对 SELECT 查询的结果进行排序?

sql - 删除 SQL 查询中的重复行

teradata - 在 Teradata 中计算上周数据