Khi sử dụng TOP
trong một truy vấn trong SQL Server, bạn có thể gặp trường hợp hai hoặc nhiều kết quả buộc ở vị trí cuối cùng. Bạn có thể thậm chí sẽ không biết khi nào điều này xảy ra, vì hành vi mặc định của TOP
là trả về không quá số hàng bạn chỉ định.
TOP
mệnh đề chấp nhận WITH TIES
đối số cho phép bạn chỉ định có bao gồm tất cả các kết quả gắn với vị trí cuối cùng hay không. Các hàng có thể đứng ở vị trí cuối cùng do ORDER BY
của chúng cột chứa cùng một giá trị. Do đó, việc sử dụng đối số này có thể dẫn đến nhiều hàng được trả về hơn mức bạn thực sự chỉ định.
Ví dụ 1 - Dữ liệu
Đầu tiên, đây là dữ liệu chúng tôi sẽ làm việc với các ví dụ sau:
CHỌN AlbumId, AlbumName, ArtistId TỪ Album;
Kết quả:
+ ----------- + -------------------------- + ------- ----- + | AlbumId | AlbumName | ArtistId || ----------- + -------------------------- + -------- ---- || 1 | Powerslave | 1 || 2 | Nguồn điện | 2 || 3 | Hát Xuống Ngõ | 6 || 4 | Ziltoid the Omniscient | 5 || 5 | Thương vong của Cool | 5 || 6 | Epicloud | 5 || 7 | Một nơi nào đó trong thời gian | 1 || 8 | Piece of Mind | 1 || 9 | Kẻ giết người | 1 || 10 | Không cầu nguyện cho người chết | 1 || 11 | Không Có Âm Thanh Không Có Im Lặng | 9 || 12 | Big Swing Face | 4 || 13 | Đêm xanh | 12 || 14 | Vĩnh cửu | 12 || 15 | Scandinavia | 12 || 16 | Vali Lâu Mất | 7 || 17 | Khen ngợi và Đổ lỗi | 7 || 18 | Cùng Came Jones | 7 || 19 | Cả Đêm Sai | 3 || 20 | Mười sáu người đàn ông của Tain | 3 || 21 | Yo Wassup | 9 || 22 | Nhộn nhịp | 9 | + ----------- + -------------------------- + -------- ---- +
Ví dụ 2 - Sử dụng TOP không ràng buộc
Đây là những gì sẽ xảy ra nếu chúng ta sử dụng TOP
không có chỉ định WITH TIES
. Đây là cách mà hầu hết mọi người sử dụng mệnh đề này.
Trong trường hợp này, tôi sắp xếp kết quả theo ArtistId
.
CHỌN ĐẦU (3) AlbumId, AlbumName, ArtistId TỪ AlbumsORDER THEO ArtistId ASC;
Kết quả:
+ ----------- + ------------------- + ------------ + | AlbumId | AlbumName | ArtistId || ----------- + ------------------- + ------------ || 1 | Powerslave | 1 || 7 | Một nơi nào đó trong thời gian | 1 || 8 | Piece of Mind | 1 | + ----------- + ------------------- + ------------ +Như mong đợi, chúng tôi nhận được ba hàng. Đây là ba mục hàng đầu như được chỉ định bởi
TOP
mệnh đề.Ví dụ 3 - Sử dụng TOP với Ties
Bây giờ cho các mối quan hệ. Đây là những gì sẽ xảy ra nếu chúng tôi thêm
WITH TIES
.CHỌN ĐẦU (3) VỚI TIES AlbumId, AlbumName, ArtistId TỪ AlbumsORDER BY ArtistId ASC;Kết quả:
+ ----------- + ------------------------- + -------- ---- + | AlbumId | AlbumName | ArtistId || ----------- + ------------------------- + --------- --- || 1 | Powerslave | 1 || 7 | Một nơi nào đó trong thời gian | 1 || 8 | Piece of Mind | 1 || 9 | Kẻ giết người | 1 || 10 | Không cầu nguyện cho người chết | 1 | + ----------- + ------------------------- + --------- --- +Bây giờ chúng ta có năm hàng thay vì chỉ ba hàng. Điều này là do có thêm hai hàng chia sẻ cùng một
ArtistId
như hàng thứ ba. Nói cách khác, ba hàng được xếp ở vị trí cuối cùng.Lưu ý rằng trong SQL Server, thứ tự buộc các hàng được trả về là tùy ý.
Ví dụ 4 - Mệnh đề ORDER BY được sửa đổi để loại bỏ ràng buộc
Nếu chúng ta thêm
AlbumId
vào cộtORDER BY
điều này loại bỏ hoàn toàn các ràng buộc.CHỌN ĐẦU (3) VỚI TIES AlbumId, AlbumName, ArtistId TỪ AlbumsORDER BY ArtistId ASC, AlbumId ASC;Kết quả:
+ ----------- + ------------------- + ------------ + | AlbumId | AlbumName | ArtistId || ----------- + ------------------- + ------------ || 1 | Powerslave | 1 || 7 | Một nơi nào đó trong thời gian | 1 || 8 | Piece of Mind | 1 | + ----------- + ------------------- + ------------ +Vì vậy, ngay cả khi chúng tôi chỉ định
WITH TIES
, không có cái nào trong trường hợp này.Ví dụ 5 - Sử dụng mệnh đề WHERE
Đây là một ví dụ cuối cùng, trong đó tôi sử dụng
WHERE
mệnh đề để trích xuất một loạt các hàng từ giữa bảng. Ví dụ đầu tiên là không có ràng buộc và ví dụ thứ hai là có ràng buộc.Không có ràng buộc:
CHỌN ĐẦU (4) AlbumId, AlbumName, ArtistId FROM AlbumsWHERE AlbumId> 10ORDER BY ArtistId ASC;Kết quả:
+ ----------- + ------------------------- + -------- ---- + | AlbumId | AlbumName | ArtistId || ----------- + ------------------------- + --------- --- || 19 | Cả Đêm Sai | 3 || 20 | Mười sáu người đàn ông của Tain | 3 || 12 | Big Swing Face | 4 || 16 | Vali Lâu Mất | 7 | + ----------- + ------------------------- + --------- --- +Với các mối quan hệ:
CHỌN ĐẦU (4) VỚI TIES AlbumId, AlbumName, ArtistId FROM AlbumsWHERE AlbumId> 10ORDER BY ArtistId ASC;Kết quả:
+ ----------- + ------------------------- + -------- ---- + | AlbumId | AlbumName | ArtistId || ----------- + ------------------------- + --------- --- || 19 | Sai Cả Đêm | 3 || 20 | Mười sáu người đàn ông của Tain | 3 || 12 | Big Swing Face | 4 || 16 | Vali Lâu Mất | 7 || 17 | Khen ngợi và Đổ lỗi | 7 || 18 | Cùng Came Jones | 7 | + ----------- + ------------------------- + --------- --- +