2016-10-05 10 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  

総数それが働いたサブクエリの値をハードコーディングします。挿入された行数:105615,541

今後の進め方としてご案内しています。ありがとう

+0

いくつかのサンプルデータとともに完全な選択および挿入ステートメントを含めてください。 –

+0

@TimBiegeleisenあなたの答えをありがとう。 Select文とサンプル出力を含めました。 Date colの内部結合を試みましたが、それは機能しましたが、左の結合は機能しませんでした。私は希望の出力を取得していないとサブクエリ約4~5行を生成します。 – madsthiru

+0

挿入なしの選択は機能しますか? Btw、 'EXTRACT'はINTEGERを返します.'01 'の代わりに' 1'を使うのが良いでしょう。 – dnoeth

答えて

0

この問題に関する最新情報です。私はTeradata Supportからの説明を得ました。 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

は、基本的に元のクエリは、フィルタあなたが提出しているレコードを望んでいない状態、REF_NBR =」で、TABLEBとTABLECからいくつかのデータを取得したい:これはメッセージからマニュアルですVALUE '

Timが提案したように、可能な回避策(提案されているように、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がヌル"の条件では、CUSTOMER_CT_KEYがサブクエリDに表示されないレコードだけが結果セットに表示されます。

テスト提案された解決策にいくつかの誤解、実際のOPの要求があったので、私たちはより良いお互いを理解するためにそれを使用できるように、ソリューション

が、私は、基本的なテストケースを用意してみましたソリューションとコーナーケース。

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 initial proposal

シミュレーションの Simulation of the original query

シミュレーション Simulation of present proposal (私はすでに、データが偏っや架空だったことを言いましたよね?: - ))

OPは、揮発性テーブルに挿入するいくつかのフィードバックやいくつかの偽のデータを与えることができますか?

+0

あなたの努力のために本当にありがとう。あなたの質問を実行しようとしました。残念ながら、それは同じエラーを投げています。 – madsthiru