从Select(Teradata)插入

时间:2013-04-29 12:35:58

标签: 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亿条记录,新表格为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条记录,所以根本不需要外连接,我只是在这里使用它来证明记录号不同,但它不应该是

2 个答案:

答案 0 :(得分:2)

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

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

当您准确计算缺失行数时,结果为4.294.967.296?

然后它可能是由于"警告:6813内部计数器中的数字溢出。"

来自消息手册的剪切和粘贴:

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

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

迪特

答案 1 :(得分:0)

You should create a multi set table. It will do the trick!

A
B
C
D
G
H
I

The above syntax worked for me!