2016-09-08 3 views
-2

공통 테이블 식 (CTE) 내에서 재귀를 사용하여 여러 행을 연결합니다. 재귀가 잘 작동합니다. 그러나 CTE 후 SELECT 문에서 연결된 문자열이있는 행만 반환하려고합니다. 하지만 MAX (stringValue) 가장 짧은 문자열을 반환합니다. MIN (stringValue)을 사용하면 올바른 (가장 긴) 문자열을 반환합니다. 왜 그런가요?
이는 CTE의 데이터가 모든 행을 반환 할 때입니다 :GROUP BY 결과가 Max() 문자열을 반환하지 않습니다.

SELECT MAX(Row) AS RowNumber, MAX(TableName) AS Tbl, MAX(Script) 
FROM CTE 
GROUP BY TableName 

내 결과는 다음과 같습니다

Row  TableName  Script 
1  Activity  This is a string that I created. 
1  Table2   This is another string. 
2  Table2   This is another string. This is another string. 
1  Table3   Test string. 
2  Table3   Test string. Test string 2. 
3  Table3   Test string. Test string 2. Test string 3. 

나는 MAX (행) 만 행을 반환하는이 쿼리를 사용

이 :

Row  TableName  Script 
1  Activity  This is a string that I created. 
2  Table2   This is another string. 
3  Table3   Test string. 

올바른 행은 반환되지만 올바른 스크립트는 아닙니다. 나는이 쿼리를 사용하는 경우 는 :

SELECT MAX(Row) AS RowNumber, MAX(Table) AS Tbl, MIN(Script) 
    FROM CTE 
    GROUP BY TableName 

을 나는 즉, 정확한 데이터를 얻을. 가장 긴 문자열. 이유가 무엇인가요?

다른 쿼리에서 이것을 사용했으며 올바른 문자열, 즉 가장 긴 문자열이 반환되었습니다.

나는 이러한 결과가 예측할 수없고 일관성이 없을 것이라고 우려하고 있습니다.

UPDATE 나는 이러한 행을 반환하려면 :

Row TableName  Script 
    1  Activity  This is a string that I created. 
    2  Table2   This is another string. This is another string. 
    3  Table3   Test string. Test string 2. Test string 3. 
+0

'MAX'를 사용하면 문자열을 첫 번째'.'로 자르고,'MIN '을 사용하면 완전한 값을 얻을 수 있습니까? – techspider

+0

No. Max()는 가장 짧은 문자열을 반환합니다. Min()은 가장 길다를 반환합니다. –

+3

Min/Max는 문자열의 길이에 상관하지 않으며 알파벳 순서를 신경 쓰고 있습니다. – sstan

답변

1

하신 max() 당신이 원하는 행을 반환해야한다. 그러나, 당신은 또한 사용하여 최신 버전을 얻을 수 있습니다 : 이것은 가장 큰 row있는 행을 반환

select t.* 
from (select cte.*, row_number() over (partition by table order by row desc) as seqnum 
     from cte 
    ) t 
where seqnum = 1; 

. order by len(script) desc을 사용하여 가장 긴 문자열을 얻을 수도 있습니다.

코드가 작동하지 않는 이유는 tabletablename입니다. 그게 예기치 않은 결과를 설명하는지 모르겠습니다.

+0

도움을 주셔서 감사합니다. 나는 이것을 시도 할 것이다. Table/TableName은 내가 수정하게 될 실수입니다. –

+0

매력처럼 작동했습니다! 고마워요 ... 아주 영리 해요. 꼭 말해야합니다! –