2013-04-29 49 views
2

我有以下SQL语句:插入从选择(Teradata数据)

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 

这导致4.5十亿

,但是当我这样说:

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亿条记录(旧表包含45亿条记录,新增4.3亿条记录)。

为什么?

AnotherTable的definiton:

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的记录,所以外连接没有必要的,我只是在这里使用它来演示该记录号码是不同的,但它不应该是

+0

是否有可能对'newid'有非NULL约束?由于“left outer join”,这可能是NULL。 – 2013-04-29 13:01:50

+0

我提出了以下检查: 'SELECT oldtable.id,oldtable.day,newtable.newid从oldtable 左外连接newtable的上newtable.FROM_DAY 和newtable.TO_DAY和oldtable.id = newtable的之间oldtable.day。id where newtable.newid is null' 它导致了0条记录,所以根本不需要外部连接,我只是在这里用它来证明记录号是不同的,但它不应该是 – 2013-04-29 13:05:55

+0

您是否收到任何来自数据库服务器的错误消息?是否有任何磁盘存储限制问题?如果它继续失败,可能尝试从SQL select中生成插入语句,然后再运行插入脚本。 – 2013-04-29 13:16:16

回答

2

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

45亿减去3亿是约。 42亿美元。

当你完全计算缺失的行数是4.294.967.296?

然后它可能是由于“警告:6813内部计数器的数值溢出”。

剪切&从消息手工粘贴:

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

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

迪特

+0

我不再在公司工作,所以我不能检查,但这似乎是最好的原因 – 2013-06-28 20:54:38

0

你应该创建一个多集表。它会做的伎俩!

CREATE MUTLISET TABLE(); 
INSERT INTO() 
SELECT() 

上面的语法适合我!