Có thể có tình huống khi bạn có nhiều bản ghi trùng lặp trong một bảng. Trong khi lấy ra bản ghi như vậy, chỉ cần lấy các bản ghi duy nhất mà thôi chứ không phải lấy các bản ghi trùng lặp.
Từ khoá DISTINCT trong SQL, được sử dụng kết hợp với câu lệnh SELECT để loại bỏ tất cả các bản ghi trùng lặp và chỉ lấy ra các bản ghi duy nhất.
Nội dung chính
Cú pháp
Cú pháp cơ bản của một từ khoá DISTINCT để loại bỏ các bản ghi trùng lặp như sau.
SELECT DISTINCT column1, column2,.....columnN FROM table_name WHERE [condition]
Ví dụ
Hãy xem xét bảng CUSTOMERS có các bản ghi sau.
+----+----------+-----+-----------+----------+ | ID | NAME | AGE | ADDRESS | SALARY | +----+----------+-----+-----------+----------+ | 1 | Ha Anh | 32 | Da Nang | 2000.00 | | 2 | Van Ha | 25 | Ha Noi | 1500.00 | | 3 | Vu Bang | 23 | Vinh | 2000.00 | | 4 | Thu Minh | 25 | Ha Noi | 6500.00 | | 5 | Hai An | 27 | Ha Noi | 8500.00 | | 6 | Hoang | 22 | Ha Noi | 4500.00 | | 7 | Binh | 24 | Ha Noi | 10000.00 | +----+----------+-----+-----------+----------+
Trước tiên, chúng ta hãy xem cách truy vấn SELECT sau đây sẽ trả về danh sách SALARY.
SELECT SALARY FROM CUSTOMERS ORDER BY SALARY;
Điều này sẽ tạo ra kết quả sau khi mức lương 2000 đã hiển thị hai lần, đó là do có bản ghi trùng lặp.
+----------+ | SALARY | +----------+ | 1500.00 | | 2000.00 | | 2000.00 | | 4500.00 | | 6500.00 | | 8500.00 | | 10000.00 | +----------+
Bây giờ, hãy sử dụng từ khóa DISTINCT với truy vấn SELECT ở trên và xem kết quả.
SELECT DISTINCT SALARY FROM CUSTOMERS ORDER BY SALARY;
Điều này sẽ tạo ra kết quả sau và không có hạng mục nào bị trùng lặp.
+----------+ | SALARY | +----------+ | 1500.00 | | 2000.00 | | 4500.00 | | 6500.00 | | 8500.00 | | 10000.00 | +----------+
Check performance issue
----------------------------------- /* QUERY CHECKING UPON SLOWNESS */ ----------------------------------- SELECT SPID, ER.percent_complete, CAST (((DATEDIFF (s, start_time, GetDate ())) / 3600) as varchar) + 'hour (s),' + CAST ((DATEDIFF (s, start_time, GetDate ())% 3600) / 60 as varchar) + 'min,' + CAST ((DATEDIFF (s, start_time, GetDate ())% 60) as varchar) + 'sec' as running_time, CAST ((estimated_completion_time / 3600000) as varchar) + 'hour (s),' + CAST ((estimated_completion_time% 3600000) / 60000 as varchar) + 'min,' + CAST ((estimated_completion_time% 60000) / 1000 as varchar) + 'sec' as est_time_to_go, DATEADD (second, estimated_completion_time / 1000, getdate ()) as est_completion_time, /* End of Article Code */ ER.command, ER.blocking_session_id, SP.DBID, LASTWAITTYPE, DB_NAME (SP.DBID) AS DBNAME, SUBSTRING (est.text, (ER.statement_start_offset / 2) +1, ((CASE ER.statement_end_offset WHEN -1 THEN DATALENGTH (est.text) ELSE ER.statement_end_offset END - ER.statement_start_offset) / 2) + 1) as QueryText, TEXT, CPU, HOSTNAME, LOGIN_TIME, LOGINAME, SP.status, PROGRAM_NAME, NT_DOMAIN, NT_USERNAME FROM SYSPROCESSES SP INNER JOIN sys.dm_exec_requests ER ON sp.spid = ER.session_id CROSS APPLY SYS.DM_EXEC_SQL_TEXT (er.sql_handle) EST ORDER BY CPU DESC select sqltext.Text, req.session_id, req.status, req.command, req.cpu_time, req.total_elapsed_time from sys.dm_exec_requests req cross apply sys.dm_exec_sql_text(sql_handle) as sqltext