2016-10-05 1 views
0

이 질문에 대한 훌륭한 대답은 Teradata REGEXP_SPLIT_TO_TABLE Input Parameter입니다. 아래는 내가 만들 수있는 가장 간단한 예입니다.Teradata - CTE에 대한 두 조인 StrTok_Split_To_Table 함수 - 오류 3807

두 개의 CTE (WITH 절)가있는 TERADATA 쿼리가 있습니다. 첫 번째 CTE는 사용자로부터 매개 변수를 수집하는 두 번째 CTE를 참조하는 STRTOK_SPLIT_TO_TABLE 함수를 포함합니다. 쿼리의 본문에는 첫 번째 CTE를 참조하고 분할 매개 변수의 열을 가져 오는 SELECT 문이 있습니다. 위대한 작품 :

WITH 
    SPLIT_PARAMS(PARAM) AS 
    (SELECT 
     TEST_TABLE.SPLIT_PARAMS 
    FROM 
     TABLE (StrTok_Split_To_Table(1, PARAMS.INPUT_PARAMS, '|') 
      RETURNS (outkey INTEGER, TOKENNUM INTEGER, SPLIT_PARAMS VARCHAR(8192) CHARACTER SET Unicode)) AS TEST_TABLE) 
    , 

    PARAMS (INPUT_PARAMS) AS 
    (SELECT 
     '?InputParams' AS INPUT_PARAMS 
    ) 

SELECT 
    SPLIT_PARAMS.PARAMS 
FROM SPLIT_PARAMS 

그러나 SPLIT_PARAMS CTE를 두 번 이상 참조 할 수 있기를 원합니다. 나는이 [3807] object 'PARAMS' does not exist 오류가 있다고 할 때 :

WITH 
    SPLIT_PARAMS(PARAM) AS 
    (SELECT 
     TEST_TABLE.SPLIT_PARAMS 
    FROM 
     TABLE (STRTOK_SPLIT_TO_TABLE(1, PARAMS.INPUT_PARAMS, '|') 
      RETURNS (outkey INTEGER, TOKENNUM INTEGER, SPLIT_PARAMS VARCHAR(8192) CHARACTER SET UNICODE)) AS TEST_TABLE) 
    , 

    PARAMS (INPUT_PARAMS) AS 
    (SELECT 
     '?InputParams' AS INPUT_PARAMS 
    ) 

SELECT 
    SP1.PARAM, 
    SP2.PARAM 
FROM SPLIT_PARAMS SP1 
    CROSS JOIN SPLIT_PARAMS SP2 

나는 사물의 무리를 시도 이전에 대한 답변에서 언급 조인 주 쿼리에서 두 SPLIT_PARAMS 하위 쿼리를 넣고 오래된 스타일을 사용하여 같은 것 문제. 그러나 SPLIT_PARAMS CTE에 여러 번 가입하려고하면이 오류가 발생합니다. (실제로 설정 한 세 가지 CTE는 깊지 만 그 결과는 같습니다. "PARAMS는 존재하지 않습니다."

+1

여러 열팽창 계수가 큰 고통입니다 당신은 역순으로 정의 할 필요가 나는 경향 휘발성 테이블을 사용하십시오. – Andrew

+0

감사합니다 @ 앤드류, 나는 여러 CTE를 꽤 많이 사용하고 역 순서 제약 조건에 익숙해 져 있습니다. 여기에있는 문제는 'STRTOK_SPLIT_TO_TABLE' 함수가 포함 된 CTE에 대한 다중 조인과 관련이 있습니다 . 휘발성 테이블에 관해서, 동료들은 Crystal Reports/BOXI에서 작업하지 않는다고 전합니다. 우리가 게시하는 데 사용하는 프런트 엔드입니다. –

답변

1

이 질문이 대답 일지 모르지만 필자의 질문에 대한 대답은 아니지만 실제로 두 번째 CTE는 필요하지 않습니다. :. 단순히 strtok_Split_to_table 기능들로 입력 매개 변수를 추진하는 것은 당신이 CTE 번 이상 Split_Params 공격 할 수 있습니다 :. 테라 데이타의

WITH SPLIT_PARAMS(PARAM) AS 
(
    SELECT 
     TEST_TABLE.SPLIT_PARAMS 
    FROM 
     TABLE 
     (
      StrTok_Split_To_Table(1, '?InputParams', '|') 
      RETURNS (outkey INTEGER, TOKENNUM INTEGER, SPLIT_PARAMS VARCHAR(8192) CHARACTER SET Unicode) 
     ) AS TEST_TABLE 
) 
SELECT 
    SP1.PARAM, 
    SP2.PARAM 
FROM SPLIT_PARAMS SP1 
    CROSS JOIN SPLIT_PARAMS SP2 
+0

이것은 처음 매개 변수를 함수에서 가져 오는 방법을 알아 내려고 할 때 시작점이었습니다. http://stackoverflow.com/q/39709105/293078. 흥미롭게도, 나는 그걸 옵션으로 보지 못했습니다. 그것은 CTE의 각 세트를 두 배로 늘리는 (tripling ...) 유일한 다른 문제를 능가합니다. 확실히 upvote받을 가치가있어! –

+0

다른 옵션은 CTE를 사용하지 않고 CTE가 여기에서 작동하지 않기 때문에 Split_Params를 기본 쿼리에 하위 쿼리로 여러 번 붙여 넣는 것입니다. – JNevill

+0

사실, 위의 답변은 정상적으로 작동합니다. 해결할 수없는 유일한 문제는 하나의 CTE에 모든 매개 변수 (다른 매개 변수가 있음)를 원하는 미학적 인 것입니다. 나는 계속해서 그것을 받아 들일 것이다. 다시 한번 감사드립니다. –

관련 문제