2009-08-20 37 views
11

chúng tôi có một cái nhìn trong cơ sở dữ liệu của chúng tôi có một ORDER BY trong đó. Bây giờ, tôi nhận ra lượt xem thường không đặt hàng, bởi vì những người khác nhau có thể sử dụng nó cho những thứ khác nhau và muốn nó được đặt hàng khác nhau. Tuy nhiên, chế độ xem này được sử dụng cho một trường hợp sử dụng VERY SPECIFIC yêu cầu một đơn đặt hàng nhất định. (Đây là bảng xếp hạng đồng đội cho giải đấu bóng đá.)ORDER BY trong một Sql Server 2008 xem

Cơ sở dữ liệu là Sql Server 2008 Express, v.10.0.1763.0 trên hộp Windows Server 2003 R2.

Quan điểm được định nghĩa như vậy:

CREATE VIEW season.CurrentStandingsOrdered 
AS 
    SELECT TOP 100 PERCENT *, season.GetRanking(TEAMID) RANKING 
    FROM season.CurrentStandings 
    ORDER BY 
     GENDER, TEAMYEAR, CODE, POINTS DESC, 
     FORFEITS, GOALS_AGAINST, GOALS_FOR DESC, 
     DIFFERENTIAL, RANKING 

Nó trả về:

GENDER, TEAMYEAR, CODE, TEAMID, CLUB, NAME, 
WINS, LOSSES, TIES, GOALS_FOR, GOALS_AGAINST, 
DIFFERENTIAL, POINTS, FORFEITS, RANKING 

Bây giờ, khi tôi chạy một CHỌN chống lại xem, nó ra lệnh cho các kết quả theo GIỚI TÍNH, TEAMYEAR , CODE, TEAMID. Lưu ý rằng nó được đặt hàng bởi TEAMID thay vì POINTS theo thứ tự theo điều khoản quy định.

Tuy nhiên, nếu tôi sao chép câu lệnh SQL và chạy nó chính xác như trong cửa sổ truy vấn mới, nó đặt hàng chính xác như được chỉ định theo mệnh đề ORDER BY.

Trả lời

19

Thứ tự của các hàng được trả về bởi một chế độ xem có mệnh đề là ORDER BY không bao giờ được đảm bảo. Nếu bạn cần một thứ tự hàng cụ thể, bạn phải chỉ định nơi bạn chọn từ chế độ xem.

Xem ghi chú này ở đầu mục nhập this Book On-Line.

+0

Thật khó chịu! Tôi có thể thấy/hiểu không đảm bảo nó trong một VIEW, loại ... nhưng nó ít nhất phải làm việc trong một hàm có giá trị bảng. GRRR. Cảm ơn câu trả lời anyway. :) – eidylon

19

SQL Server 2005 bỏ qua TOP 100 PERCENT theo thiết kế.

Hãy thử TOP 2000000000 thay thế.

Bây giờ, tôi sẽ cố gắng và tìm thấy một tài liệu tham khảo ... Tôi đã ở một hội thảo được trình bày bởi Itzak Ben-Gan ai đề cập đến nó

Tìm thấy một số ...

Kimberly L. Tripp

"TOP 100 Percent ORDER BY Considered Harmful"

Trong trường hợp đặc biệt này, tôi ưu hoa nhận ra rằng TOP 100 PERCENT đủ điều kiện tất cả các hàng và không cần để được tính toán.

+0

tôi tò mò về vấn đề này SQL Server hotfix Tôi chỉ cần stumbled trên: http://support.microsoft.com/kb/926292: nếu tôi đọc nó một cách chính xác, sau đó các hotfix 'sửa' hành vi để sắp xếp? –

+0

@MitchWheat: vâng, có vẻ quen thuộc.Tôi nghĩ rằng nó có nghĩa là bên trong TOP..ORDER BY fubars ORDER bên ngoài BY – gbn

+0

Tôi không chắc chắn nó. Dường như nói rằng áp dụng các hotfix sẽ đảm bảo rằng ORDER BY trong quan điểm luôn luôn hoạt động (mà rõ ràng là mâu thuẫn với bài viết MSDN (và có thể có ý nghĩa tốt!)) –

2

chạy theo dõi profiler trên cơ sở dữ liệu của bạn và xem truy vấn thực sự đang chạy khi bạn truy vấn chế độ xem của mình.

Bạn cũng có thể muốn xem xét sử dụng quy trình được lưu trữ để trả lại dữ liệu từ chế độ xem của mình, được sắp xếp chính xác cho trường hợp sử dụng cụ thể của bạn.

+0

Yah, tôi đã thực sự tìm kiếm một cái gì đó trực tiếp truy vấn mặc dù ... xem, bảng giá trị chức năng, mà một sproc không. – eidylon

4

Chỉ cần sử dụng:

"hàng đầu (99) Phần trăm"

hoặc

"Top (một số 1000s lần so với dòng dữ liệu của bạn như 24682468123)" nó hoạt động! hãy thử nó.

4

Trong SQL server 2008, ORDER BY bị bỏ qua trong các chế độ xem sử dụng TOP 100 PERCENT. Trong các phiên bản trước của máy chủ SQL, ORDER BY chỉ được phép nếu TOP 100 PERCENT được sử dụng, nhưng một thứ tự hoàn hảo không bao giờ được đảm bảo. Tuy nhiên, nhiều người cho rằng một trật tự hoàn hảo đã được đảm bảo. Tôi suy luận rằng Microsoft không muốn đánh lừa các lập trình viên và các DBA tin rằng có một trật tự được bảo đảm bằng cách sử dụng kỹ thuật này.

Một cuộc biểu tình so sánh tuyệt vời của sự thiếu chính xác này, có thể được tìm thấy ở đây ...

http://blog.sqlauthority.com/2009/11/24/sql-server-interesting-observation-top-100-percent-and-order-by

Rất tiếc, tôi chỉ nhận thấy rằng điều này đã được trả lời. Nhưng kiểm tra các cuộc biểu tình so sánh là giá trị một cái nhìn nào.

2

Tôi tìm thấy giải pháp thay thế.

Kế hoạch ban đầu của tôi là tạo cột 'sắp xếp' để ngăn người dùng phải thực hiện một loại phức tạp.

Tôi đã sử dụng chức năng có cửa sổ ROW_NUMBER. Trong mệnh đề ORDER BY, tôi đã chỉ định thứ tự sắp xếp mặc định mà tôi cần (giống như nó đã có trong ORDER BY của câu lệnh SELECT).

tôi nhận được nhiều kết quả tích cực:

  1. Theo mặc định, dữ liệu được bị trả lại trong thứ tự sắp xếp mặc định tôi dự định ban đầu (điều này có lẽ là do chức năng cửa sổ cần phải sắp xếp các dữ liệu trước khi gán giá trị SORT_ORDER)

  2. người dùng khác có thể sắp xếp dữ liệu theo những cách thay thế nếu họ chọn để

  3. cột SORT_ORDER là có cho một nhu cầu loại rất cụ thể, làm cho nó dễ dàng hơn fo r người sử dụng để sắp xếp các dữ liệu nên bất cứ công cụ họ sử dụng sắp xếp lại các rowset.

Lưu ý: Trong ứng dụng cụ thể của tôi, người dùng đang truy cập chế độ xem qua Excel 2010 và theo mặc định dữ liệu được trình bày cho người dùng như tôi đã mong đợi mà không cần phân loại thêm.

Hy vọng điều này sẽ giúp những người có vấn đề tương tự.

Chúc mừng, Ryan

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