Hỏi Đáp SQL------------ Không có câu hỏi nào là sơ đẳng --------

Vài lưu ý khi sử dụng DISTINCT

DISTINCT được sử dụng để loại bỏ sự trùng lặp. Nó được sử dụng khá phổ biến, nhưng lại ít được lưu tâm đúng mức về cách thức nó hoạt động, dẫn đến trường hợp câu lệnh trả về "khi đúng khi sai"


Xét bảng ví dụ sau đây




Sau đây là vài điểm bạn cần lưu tâm.


1 - DISCTINCT loại bỏ sự trùng lặp của cả dòng, chứ không phải trường. Tức nếu mệnh đề SELECT bao gồm 5 trường thì tính duy nhất áp dụng cho toàn bộ 5 trường.


2 - Để chọn ra dòng duy nhất, DISTINCT phải sắp xếp dữ liệu thành nhóm, rồi lấy dòng đầu tiên dựa theo 1 trật tự nhất định.


- Nhóm dựa vào toàn bộ số trường ở lệnh SELECT.
- Trật tự dựa vào thứ tự từ trái sang phải của trường trong mệnh đề SELECT, với thứ tự tăng dần.


Sắp xếp trật tự là 1 trong những hoạt động khá tốn kém. Nên bạn cần lưu tâm, không dùng DISTINCT khi không thực sự cần thiết. Trong thực tế, tôi đã thấy có nhiều câu lệnh bao gồm mệnh đề DISTINCT, nhưng thực sự lại không cần thiết, có thể lập trình viên không ý thức được, hoặc làm biếng phân tích loại bỏ.


3 - Nếu trong câu lệnh có mệnh đề ORDER BY


- Các trường trong ORDER BY phải tồn tại ở mệnh đề SELECT và lúc này trật tự của DISTINCT sẽ dựa vào trật tự ở ORDER BY.


- Trong trường hợp mệnh đề SELECT chứa các trường không tồn tại ở ORDER BY, trật tự của DISTINCT vẫn phải dựa vào trật tự ở ORDER BY trước, rồi sau đó mới áp dụng trật tự cho các trường kia, theo thứ tự từ trái sang phải và tăng dần.


Sau đây là toàn bộ câu lệnh cho bạn chạy thử.
declare @temp table(a int, b varchar(10))
insert into @temp values(1,'tran'),(1,'le'),(1,'phan'),
(2,'nguyen'),(3,'dinh'),(3,'hoang'),
(2,'nguyen'),(3,'dinh'),(3,'hoang'),
(1,'aaaa'),(2,'le'),(3,'hoang');

select distinct a from @temp;
select distinct a, b from @temp;

select distinct a, b, len(b)as c
from @temp order by a, len(b)desc;

select distinct a, b, len(b)as c
from @temp order by a, b, len(b)desc



Không có nhận xét nào:

Đăng nhận xét