web-dev-qa-db-ja.com

ORDER BY NULLを指定したLISTAGGは、実際に注文基準として何を使用しますか?

私が行った場合

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

クエリは、非決定論的順序(NULLまたは定数)でORDER BYを使用すると英数字の並べ替えを実行し、ORDER BY ROWNUM(決定論的)を使用すると入力順序を維持しているように見えます。

LISTAGG ドキュメントには次のように記載されています。

Order_by_clauseは、連結された値が返される順序を決定します。この関数は、ORDERBY列リストが一意の順序を達成した場合にのみ決定論的です。

そして 分析関数 を見ると、次のように述べられています。

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順序句にもかかわらず、要素はアルファベット順に集約されています。これは、定数のORDERBY式を使用する場合のデフォルトの動作のようです。

ただし、これはOracle以外のサイトでの動作に関するコメントにすぎません。

13
MT0

おそらく、順序は、クエリの実行プラン、インスタンスの構成、exadataを使用しているかどうかに関係なく、データベースのバージョンなど、多くの要因によって異なります。

オラクルにデータを順序付けるための特定の基準を与えていない場合、たとえ試行からデータが特定の方法で一貫してソートされているように見えても、特定の順序を当てにすることはできません。

listaggのOracleドキュメント によると:

  • Order_by_clauseは、連結された値が返される順序を決定します。この関数は、ORDERBY列リストが一意の順序を達成した場合にのみ決定論的です。
1
mic.sca