programing

LISTAGG with ORDER BY NULL이 실제로 주문 기준으로 사용하는 것은?

sourcejob 2023. 9. 16. 08:58
반응형

LISTAGG with ORDER BY NULL이 실제로 주문 기준으로 사용하는 것은?

하게되면

SELECT LISTAGG( COLUMN_VALUE ) WITHIN GROUP ( ORDER BY NULL )   AS OrderByNULL,
       LISTAGG( COLUMN_VALUE ) WITHIN GROUP ( ORDER BY 1 )      AS OrderByCONST,
       LISTAGG( COLUMN_VALUE ) WITHIN GROUP ( ORDER BY ROWNUM ) AS OrderByROWNUM
FROM   TABLE( SYS.ODCIVARCHAR2LIST( '5', '222', '4' ) );

출력은 다음과 같습니다.

ORDERBYNULL ORDERBYCONST ORDERBYROWNUM
----------- ------------ -------------
222,4,5     222,4,5      5,222,4

쿼리는 다음을 사용할 때 영숫자 정렬을 수행한 것으로 보입니다.ORDER BY비결정론적 주문()과 함께)NULL또는 상수)를 사용할 때 입력 순서를 유지했습니다.ORDER BY ROWNUM(결정론적).

설명서에는 다음과 같이 명시되어 있습니다.

order_by_clause는 연결된 값이 반환되는 순서를 결정합니다.ORDER BY 열 목록이 고유한 순서를 달성한 경우에만 함수가 결정적입니다.

그리고 분석 함수를 살펴보면 다음과 같이 말합니다.

order_by_clause가 여러 행에 대해 동일한 값을 나타낼 때마다 함수는 다음과 같이 동작합니다. [...] 다른 모든 분석 함수의 경우 결과는 창 규격에 따라 달라집니다.RANGE 키워드로 논리적 창을 지정하면 함수는 각 행에 대해 동일한 결과를 반환합니다.ROWS 키워드를 사용하여 물리적 창을 지정하면 결과가 결정적이지 않습니다.

제가 문서를 통해 알 수 있는 한, 비결정론적 순서는 예상되는 것입니다. 그러나 함수는 행이 처리되는 순서(일반적으로 사용되는 보기)가 아니라 영숫자 정렬을 기반으로 결정론적 출력을 제공합니다.

이는 다른 분석 함수의 동작과 다릅니다(물리적 창을 사용하는 경우).ROWS키워드):

SELECT LAST_VALUE( COLUMN_VALUE )
         OVER ( ORDER BY NULL   ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING )
         AS BYNULL,
       LAST_VALUE( COLUMN_VALUE )
         OVER ( ORDER BY 1      ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING )
         AS BYCONST,
       LAST_VALUE( COLUMN_VALUE )
         OVER ( ORDER BY ROWNUM ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING )
         AS BYROWNUM
FROM   TABLE( SYS.ODCIVARCHAR2LIST( '5', '222', '4' ) );

이것은 모든 다른 순서에 대해 일관된 출력을 제공합니다.

BYNULL BYCONST BYROWNUM
------ ------- --------
4      4       4
4      4       4
4      4       4

다음과 같은 경우에 주문이 어떻게 적용되는지에 대한 공식 문서가 있습니까?LISTAGG비결정론적 주문을 공급받습니까?

참고: 다음의 동작ORDER BY NULL여기에 다음과 같이 설명합니다.

이 예제에서는 NULL 순서 절에도 불구하고 요소가 알파벳 순으로 집계되었습니다.식에 따라 일정한 ORDER를 사용하는 경우 기본 동작으로 나타납니다.

그러나 이것은 오라클이 아닌 사이트에서의 행동에 대한 논평일 뿐입니다.

이 순서는 쿼리 실행 계획, 인스턴스 구성, 데이터베이스 버전 등 여러 요소에 따라 달라질 수 있습니다.

Oracle이 데이터를 주문할 수 있는 특정 기준을 제시하지 않는 경우에는 테스트를 통해 특정 방식으로 일관되게 데이터를 정렬하는 것처럼 보이더라도 특정 주문에 의존할 수 없습니다.

listagg에 대한 Oracle 설명서에 따르면 다음과 같습니다.

  • order_by_clause는 연결된 값이 반환되는 순서를 결정합니다.ORDER BY 열 목록이 고유한 순서를 달성한 경우에만 함수가 결정적입니다.

언급URL : https://stackoverflow.com/questions/35747417/what-does-listagg-with-order-by-null-actually-use-as-the-order-criteria

반응형