2009-03-27 28 views
6

Có bao gồm DISTINCT trong truy vấn SELECT ngụ ý rằng tập hợp kết quả phải được sắp xếp không?CHỌN DISTINCT ngụ ý một loại kết quả

Tôi không nghĩ vậy, nhưng tôi đang tìm một câu trả lời có thẩm quyền (liên kết web).

Tôi đã có một truy vấn như thế này:

Select Distinct foo 
From Bar 

Trong oracle, kết quả rõ rệt nhưng không theo thứ tự sắp xếp. Trong máy bay phản lực/MS-Access có vẻ là một số công việc phụ được thực hiện để đảm bảo rằng các kết quả được sắp xếp. Tôi giả định rằng oracle là sau spec trong trường hợp này và MS Access là đi xa hơn.

Ngoài ra, có cách nào tôi có thể cung cấp cho bảng một gợi ý rằng nó nên được phân loại trên foo (trừ khi có quy định khác)?

Trả lời

4

Từ SQL92 specification:

Nếu DISTINCT được chỉ định, sau đó để TXA là kết quả của cách loại bỏ các giá trị trùng lặp không cần thiết từ TX. Nếu không, hãy để TXA là TX.

...

4) Nếu không được chỉ định, thì thứ tự của các hàng Q phụ thuộc vào việc triển khai thực hiện.

Cuối cùng câu trả lời thực sự là DISTINCT và ORDER BY là hai phần riêng biệt của câu lệnh SQL; Nếu bạn không có mệnh đề ORDER BY, kết quả theo định nghĩa sẽ không được sắp xếp cụ thể.

1

Không, nó không ngụ ý sắp xếp. Theo kinh nghiệm của tôi, nó sắp xếp theo chỉ số đã biết, có thể xảy ra là foo.

Tại sao phải tinh tế? Tại sao không cụ thể Chọn foo khác biệt từ Bar Order by foo?

+0

Làm thế nào vì đó không phải là thứ tự bạn muốn? – dkretz

+0

Trong bài viết của mình "phân loại trên foo (trừ khi có quy định khác)" Tôi hỏi tại sao không chỉ định foo trừ khi được quy định khác – jerebear

+0

Tại sao phải tinh tế và gợi ý? Tôi chỉ không muốn phải biên dịch lại và triển khai lại vào thời điểm này. Nếu tôi có thể đưa ra một gợi ý, nó sẽ giải quyết được vấn đề của tôi và tôi có thể sửa chữa một cách rõ ràng vào thời điểm thuận tiện hơn. –

1

Không phải với kiến ​​thức của tôi, không. Lý do duy nhất tôi có thể nghĩ là SQL Server sẽ sắp xếp nội bộ dữ liệu để phát hiện và lọc ra các bản sao, và do đó trả về nó theo cách "sắp xếp trước". Nhưng tôi sẽ không dựa vào "hiệu ứng phụ" :-)

0

Trên ít nhất một máy chủ tôi đã sử dụng (có thể là Oracle hoặc SQL Server, cách đây khoảng 6 năm), SELECT DISTINCT đã bị từ chối nếu bạn không làm như vậy t có mệnh đề ORDER BY. Nó được chấp nhận trên máy chủ "khác" (Oracle hoặc SQL Server). Số dặm của bạn có thể thay đổi.

0

Không, kết quả không được sắp xếp. Nếu bạn muốn để cho nó một 'gợi ý', bạn chắc chắn có thể cung cấp một ORDER BY:

chọn riêng biệt foo từ thanh trật tự bởi foo

Nhưng hãy nhớ rằng bạn có thể muốn sắp xếp trên hơn chỉ theo thứ tự abc. Thay vào đó, bạn có thể muốn sắp xếp các tiêu chí trên các trường khác. Xem:

http://weblogs.sqlteam.com/jeffs/archive/2007/12/13/select-distinct-order-by-error.aspx

3

Không có "thẩm quyền" câu trả lời liên kết, vì đây là một cái gì đó mà không có bảo đảm SQL server.

Bạn sẽ thường thấy kết quả theo thứ tự khi sử dụng riêng biệt làm tác dụng phụ của các phương pháp tốt nhất để tìm kiếm các kết quả đó. Tuy nhiên, bất kỳ số nào khác có thể kết hợp các kết quả, và một số máy chủ có thể trả lại kết quả theo cách không cung cấp cho chúng được sắp xếp ngay cả khi nó phải sắp xếp để nhận kết quả.

Điểm mấu chốt: nếu máy chủ của bạn không đảm bảo điều gì đó bạn không nên tin cậy.

-1

Có. Oracle sử dụng một sắp xếp để tính toán một sự khác biệt. Bạn có thể thấy rằng nếu bạn nhìn vào kế hoạch giải thích. Thực tế là nó đã làm một loại cho phép tính đó không theo bất kỳ cách nào ngụ ý rằng tập hợp kết quả sẽ được sắp xếp. Nếu bạn muốn tập hợp kết quả được sắp xếp, bạn được yêu cầu sử dụng mệnh đề ORDER BY.

+0

Oracle 10 và 11 sử dụng băm để tính toán khác biệt, không phân loại. – tuinstoel

+0

Oracle 10 và 11 * có thể * sử dụng băm. –

+0

Tôi có thể tin được. Tôi đã quan sát sắp xếp trong kế hoạch để đáp ứng với một sự khác biệt. Tôi bị mắc kẹt trên 9i và 10g. – EvilTeach

5

No. Có một số trường hợp trong đó DISTINCT trong Oracle không có nghĩa là sắp xếp, quan trọng nhất là thuật toán băm được sử dụng trong 10g + cho cả nhóm và các hoạt động riêng biệt.

Luôn luôn chỉ định ORDER BY nếu bạn muốn tập hợp kết quả có trật tự, kể cả trong 9i và dưới đây.

+0

Tôi không nghĩ rằng câu trả lời cho câu hỏi. Tất nhiên bạn phải xác định cả hai nếu bạn muốn cả hai. Nhưng là một loại được thực hiện dựa trên DISTINCT bất kể loại yêu cầu của bạn (hoặc không có loại)? – dkretz

+0

Hỏi: "Có bao gồm DISTINCT trong truy vấn SELECT ngụ ý rằng tập hợp kết quả phải được sắp xếp không?" A: "Có một số trường hợp trong đó DISTINCT trong Oracle không có nghĩa là sắp xếp" Trước 10g kết quả DISTINCT ** thường ** được sắp xếp, nhưng không phải lúc nào. –

0

Như câu trả lời chủ yếu nói, DISTINCT không ủy quyền cho một thứ tự sắp xếp chỉ bằng cách ủy nhiệm điều đó. Tuy nhiên, một cách tiêu chuẩn để đạt được các kết quả DISTINCT là sắp xếp; khác là để băm các giá trị (mà có xu hướng dẫn đến bán ngẫu nhiên). Dựa vào hiệu ứng sắp xếp của DISTINCT sẽ là ngu xuẩn.

1

Trong trường hợp của tôi (máy chủ SQL), làm ví dụ tôi có một danh sách các quốc gia có giá trị bằng số X được gán cho mỗi trường. Khi tôi đã chọn riêng biệt * từ thứ tự Bảng bởi X, nó đã ra lệnh cho nó bằng X nhưng tại cùng một thời điểm, các quốc gia thiết lập kết quả cũng đã ra lệnh không được triển khai trực tiếp. Từ kinh nghiệm của tôi, tôi sẽ nói rằng sự khác biệt đó hàm ý một loại ngầm định.

+0

Bạn có thể thêm một ví dụ mã (hoặc phá vỡ những gì dường như là ví dụ mã của bạn thành một đoạn riêng biệt)? –

+0

@Jess Bowers: Dưới đây là đoạn trích: Chỉ cần đề cập đến cả ABC và #result là các bảng tạm thời được gọi trong thủ tục được lưu trữ: 'Chèn vào #Result \t chọn DISTINCT trên cùng (10) * rom ABC X \t order by XY asc chọn * từ # Kết quả' –

Các vấn đề liên quan