2016-03-02 14 views
9

Nếu tôi làmLISTAGG với ORDER BY NULL thực sự sử dụng như tiêu chí thứ tự?

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')); 

Đầu ra là:

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

Truy vấn dường như đã thực hiện một loại alphanumerical khi sử dụng ORDER BY với trật tự không xác định (NULL hoặc một hằng số) và đã duy trì sự thứ tự đầu vào khi sử dụng ORDER BY ROWNUM (xác định).

Các tài liệu LISTAGG khẳng định rằng:

Các order_by_clause xác định thứ tự trong đó các giá trị nối được trả về. Hàm này là xác định chỉ khi danh sách cột ORDER BY đạt được thứ tự duy nhất.

Và khi nhìn vào analytic functions nó nói rằng:

Bất cứ khi nào kết quả order_by_clause trong các giá trị giống hệt nhau cho nhiều hàng, các chức năng hoạt động như sau: [...] Đối với tất cả các chức năng phân tích khác, kết quả phụ thuộc vào đặc tả cửa sổ. Nếu bạn chỉ định một cửa sổ logic với từ khóa RANGE, thì hàm trả về cùng một kết quả cho mỗi hàng. Nếu bạn chỉ định một cửa sổ vật lý với từ khóa ROWS, thì kết quả là không xác định.

Vì vậy, theo như tôi có thể nói từ tài liệu, thứ tự không xác định được mong đợi - tuy nhiên, hàm cung cấp đầu ra xác định dựa trên loại chữ và số chứ không phải theo thứ tự các hàng được xử lý (là commonly held view).

này khác với hành vi của chức năng phân tích khác (khi sử dụng một cửa sổ vật lý với từ khóa 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')); 

Mà cho một đầu ra phù hợp cho tất cả các orderings khác nhau:

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

Có tài liệu chính thức nào về cách đặt hàng được áp dụng khi LISTAGG được cung cấp một thứ tự không xác định không?

Lưu ý: Hành vi của ORDER BY NULL được nhận xét về here nêu:

Trong ví dụ này, các yếu tố đã được tổng hợp theo thứ tự abc, bất chấp những khoản NULL đặt hàng. Đây có vẻ là hành vi mặc định khi sử dụng biểu thức ORDER BY hằng số

Nhưng đây chỉ là nhận xét về hành vi trong trang web không phải của Oracle.

+4

Một tập hợp các kết quả cung cấp bằng chứng cơ bản về xác định. Nếu bạn sử dụng hằng số hoặc 'NULL', thì hãy mong đợi kết quả theo bất kỳ thứ tự nào. Tài liệu hướng dẫn khá rõ ràng là bạn không thể dựa vào thứ tự khi các phím 'order by' có cùng giá trị. –

+0

Tuy nhiên, nếu bạn lặp lại bài kiểm tra (với các dữ liệu khác nhau), bạn sẽ luôn nhận được cùng một thứ tự chữ và số. Bạn cần bao nhiêu bộ kết quả cho thứ tự này để được coi là một tính năng thiết kế chứ không phải là tỷ lệ đồng? – MT0

+2

Bất cứ điều gì nó làm dường như bỏ qua NLS_COMP/SORT. Có lẽ đó là một chi tiết thực hiện. chứ không phải là một tính năng thiết kế - và vì vậy dường như không được ghi lại, kể cả trên MOS. Và như vậy, không phải là thứ bạn có thể dựa vào - vì nó có thể thay đổi trong một bản phát hành trong tương lai? Thật thú vị, nhưng không chắc liệu nó có hữu ích hay không. –

Trả lời

0

Có thể thứ tự sẽ phụ thuộc vào nhiều yếu tố, bao gồm kế hoạch thực hiện truy vấn, cấu hình cá thể của bạn, phiên bản cơ sở dữ liệu, nếu bạn đang sử dụng exadata hay không.

Nếu bạn không đưa ra bất kỳ tiêu chí cụ thể nào để đặt hàng dữ liệu bạn không thể đếm trên bất kỳ thứ tự cụ thể nào, ngay cả khi thử nghiệm của bạn dường như có được dữ liệu được sắp xếp một cách nhất quán theo một cách cụ thể.

Theo Oracle documentation for listagg:

  • Các order_by_clause xác định thứ tự trong đó các giá trị nối được trả về. Hàm này là xác định chỉ khi danh sách cột ORDER BY đạt được thứ tự duy nhất.
Các vấn đề liên quan