我有以下 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/