2016-10-05 111 views
1

我试图执行下面的查询,但我得到的错误Teradata的解析器问题

INSERT INTO TABLEA(
CUSTOMER_CT_KEY, 
CUSTOMER_ST_KEY, 
CUSTOMER_TEST_KEY, 
JAN_AMT, 
FEB_AMT, 
MAR_AMT) 
SELECT 
A.CUSTOMER_CT_KEY, 
A.CUSTOMER_ST_KEY, 
A.CUSTOMER_TEST_KEY, 
SUM(CASE WHEN EXTRACT(MONTH FROM A.DATECOL) = '01' 
      THEN A.AAA_AMT 
      ELSE 0 
      END), 
SUM(CASE WHEN EXTRACT(MONTH FROM A.DATECOL) = '02' 
      THEN A.BBB_AMT 
      ELSE 0 
      END), 
SUM(CASE WHEN EXTRACT(MONTH FROM A.DATECOL) = '03' 
      THEN A.CCC_AMT 
      ELSE 0 
      END) 
FROM TABLEB B, TABLEC C 
WHERE B.DATECOL<= C.DATECOL 
AND B.CUSTOMER_CT_KEY NOT IN 
(SELECT FS_CUSTOMER_CT_KEY FROM TABLED WHERE REF_NBR = 'VALUE') 
GROUP BY 1,2,3; 

Insert failed. 3899: Internal Error in Teradata SQL parser 

输出:在

TABLEA - EMPTY 
TABLEB - 420,098,323 
TABLEC - 1 
TABLED - 218,074 
INNER SUBQUERY - 5 

当我试图行

CUSTOMER_CT_KEY CUSTOMER_ST_KEY CUSTOMER_TEST_KEY JAN_AMT FEB_AMT MAR_AMT 
123456789  541245812  541245812   114.00 524.00 62.00 
658412457  632514257  632514257   0.00 12.00 214.00  

总数对其工作的子查询的值进行硬编码。插入的行数:105,615,541

请指导我如何继续。谢谢

+0

请包括完整的select和insert语句以及一些示例数据。 –

+0

@TimBiegeleisen感谢您的回答。我已经包含了Select语句和示例输出。我尝试了日期列上的内连接,它工作,但左连接不起作用。我没有得到所需的输出,子查询会产生大约4到5行。 – madsthiru

+0

没有插入选择工作吗?顺便说一句,'EXTRACT'返回一个INTEGER,你最好使用'1'而不是''01''。 – dnoeth

回答

0

只是在这个问题上的更新。我已经从Teradata支持部门获得了澄清。在执行Insert查询之前,必须执行以下语句。

diagnostic evlinterp on for session; 
2

如果您遇到这样的错误,您应该使用Teradata支持打开一个事件。这是从消息手册:

3899 Internal error in the Teradata SQL Parser. 
Explanation: The Teradata SQL Parser erred. 
Generated By: CON, LEX, PAR, SYN, RES and OPT modules. 
For Whom: System Support Representative. 
Notes: This is usually caused by a request that the Teradata SQL Parser could not correctly process, yet it did not detect 
an error. 
Remedy: Save all relevant information and notify your support representative. 
+0

按照你的建议可以,但我暗示了我的支持团队。希望有些事情会出现。 – madsthiru

0

基本上原始查询想从TABLEB和表C的一些数据,与您不希望在提交记录的过滤条件,当REF_NBR =” VALUE'

正如Tim所提出的,一种可能的解决方法(当您根据dnoeth建议提出一张到Teradata的票据时),可能是使用联接编写IN过滤器条件。

我对这样的查询建议如下:

SELECT 
A.CUSTOMER_CT_KEY, 
A.CUSTOMER_ST_KEY, 
A.CUSTOMER_TEST_KEY, 
SUM(CASE WHEN EXTRACT(MONTH FROM A.DATECOL) = '01' 
     THEN A.AAA_AMT 
     ELSE 0 
     END), 
SUM(CASE WHEN EXTRACT(MONTH FROM A.DATECOL) = '02' 
     THEN A.BBB_AMT 
     ELSE 0 
     END), 
SUM(CASE WHEN EXTRACT(MONTH FROM A.DATECOL) = '03' 
     THEN A.CCC_AMT 
     ELSE 0 
     END) 
    FROM TABLEB B 
     JOIN TABLEC C 
     ON B.DATECOL<= C.DATECOL 
     LEFT JOIN (SELECT FS_CUSTOMER_CT_KEY FROM TABLED 
        WHERE REF_NBR = 'VALUE') AS D 
     ON B.CUSTOMER_CT_KEY=D.FS_CUSTOMER_CT_KEY 
WHERE D.FS_CUSTOMER_CT_KEY is null 
GROUP BY 1,2,3; 

的d子查询持有的过滤条件的所有记录(希望过滤掉的那些)。 “D.FS_CUSTOMER_CT_KEY为null”条件确保只有其CUSTOMER_CT_KEY不出现在子查询D中的记录才会出现在结果集中。

测试解决方案

由于已经对所提出的解决方案的一些误解,而实际操作请求,我试着编写基本的测试案例,这样我们就可以用它来更好地了解对方解决方案和角落案例。

create multiset volatile table TABLEB (
CUSTOMER_CT_KEY BIGINT, 
CUSTOMER_ST_KEY BIGINT, 
CUSTOMER_TEST_KEY BIGINT, 
AAA_AMT decimal(38,18), 
DATECOL date 
) 
no primary index 
on commit preserve rows; 

create multiset volatile table TABLEC (
DATECOL date 
) 
no primary index 
on commit preserve rows; 

create multiset volatile table TABLED (
FS_CUSTOMER_CT_KEY bigint, 
REF_NBR VARCHAR(5) 
) 
no primary index 
on commit preserve rows; 


insert into tableb (CUSTOMER_CT_KEY, CUSTOMER_ST_KEY, CUSTOMER_TEST_KEY, AAA_AMT, DATECOL) 
       values (123456789, 541245812, 541245812, 111, '2016-01-15'); 
insert into tableb (CUSTOMER_CT_KEY, CUSTOMER_ST_KEY, CUSTOMER_TEST_KEY, AAA_AMT, DATECOL) 
       values (123456789, 541245812, 541245812, 524, '2016-02-15'); 
insert into tableb (CUSTOMER_CT_KEY, CUSTOMER_ST_KEY, CUSTOMER_TEST_KEY, AAA_AMT, DATECOL) 
       values (123456789, 541245812, 541245812, 63, '2016-03-15');   

insert into tableb (CUSTOMER_CT_KEY, CUSTOMER_ST_KEY, CUSTOMER_TEST_KEY, AAA_AMT, DATECOL) 
       values (777777777, 111222333, 444555666, 42, '2016-03-15');   


insert into tableb (CUSTOMER_CT_KEY, CUSTOMER_ST_KEY, CUSTOMER_TEST_KEY, AAA_AMT, DATECOL) 
       values (658412457, 632514257, 632514257, 0, '2016-01-15'); 
insert into tableb (CUSTOMER_CT_KEY, CUSTOMER_ST_KEY, CUSTOMER_TEST_KEY, AAA_AMT, DATECOL) 
       values (658412457, 632514257, 632514257, 12, '2016-02-15'); 
insert into tableb (CUSTOMER_CT_KEY, CUSTOMER_ST_KEY, CUSTOMER_TEST_KEY, AAA_AMT, DATECOL) 
       values (658412457, 632514257, 632514257, 214, '2016-03-15');                

insert into tableb (CUSTOMER_CT_KEY, CUSTOMER_ST_KEY, CUSTOMER_TEST_KEY, AAA_AMT, DATECOL) 
       values (777777777, 999888777, 666555444, 42, '2016-03-15');   

insert into tablec (DATECOL)     
       values ('2016-04-01');                

insert into tabled (FS_CUSTOMER_CT_KEY, REF_NBR)     
       values (777777777, 'VALUE');  
insert into tabled (FS_CUSTOMER_CT_KEY, REF_NBR)     
       values (658412457, 'OK1');                    
insert into tabled (FS_CUSTOMER_CT_KEY, REF_NBR)     
       values (658412457, 'OK2');                    
insert into tabled (FS_CUSTOMER_CT_KEY, REF_NBR)     
       values (658412457, 'OK3');                    

select 
B.CUSTOMER_CT_KEY, 
B.CUSTOMER_ST_KEY, 
B.CUSTOMER_TEST_KEY, 
SUM(case when extract(MONTH from b.DATECOL)='01' then b.aaa_amt else 0 end) jan_amt, 
SUM(case when extract(MONTH from b.DATECOL)='02' then b.aaa_amt else 0 end) feb_amt, 
SUM(case when extract(MONTH from b.DATECOL)='03' then b.aaa_amt else 0 end) mar_amt 
from tableb b, tablec c 
where b.datecol<=c.datecol 
and b.CUSTOMER_CT_KEY not in (select FS_CUSTOMER_CT_KEY from TABLED WHERE REF_NBR='VALUE') 
group by 1,2,3; 

select 
B.CUSTOMER_CT_KEY, 
B.CUSTOMER_ST_KEY, 
B.CUSTOMER_TEST_KEY, 
SUM(case when extract(MONTH from b.DATECOL)='01' then b.aaa_amt else 0 end) jan_amt, 
SUM(case when extract(MONTH from b.DATECOL)='02' then b.aaa_amt else 0 end) feb_amt, 
SUM(case when extract(MONTH from b.DATECOL)='03' then b.aaa_amt else 0 end) mar_amt 
from tableb b 
    inner join tablec c 
    on b.datecol<=c.datecol 
    left join TABLED D 
     ON B.CUSTOMER_CT_KEY=D.FS_CUSTOMER_CT_KEY 
      AND D.REF_NBR<>'VALUE' 
group by 1,2,3; 

select 
B.CUSTOMER_CT_KEY, 
B.CUSTOMER_ST_KEY, 
B.CUSTOMER_TEST_KEY, 
SUM(case when extract(MONTH from b.DATECOL)='01' then b.aaa_amt else 0 end) jan_amt, 
SUM(case when extract(MONTH from b.DATECOL)='02' then b.aaa_amt else 0 end) feb_amt, 
SUM(case when extract(MONTH from b.DATECOL)='03' then b.aaa_amt else 0 end) mar_amt 
from tableb b 
    inner join tablec c 
    on b.datecol<=c.datecol 
    left join (select FS_CUSTOMER_CT_KEY from TABLED where REF_NBR='VALUE') as D 
     ON B.CUSTOMER_CT_KEY=D.FS_CUSTOMER_CT_KEY 
WHERE D.FS_CUSTOMER_CT_KEY is null 
group by 1,2,3; 

随着(有偏见的和完全虚构的:-)数据我得到了附加结果。原始查询

模拟 Simulation of the original query

模拟的初步建议我目前的建议 Simulation of the initial proposal

模拟 Simulation of present proposal (我已经告诉你的是,数据是存有偏见,虚构的,对不对? - ))

OP可以提供一些反馈或一些假数据插入易失性表?

+0

非常感谢您的努力。我试着执行您的查询。不幸的是,它抛出了相同的错误。 – madsthiru