Đó là một câu hỏi thực sự tốt. Tôi đã đọc một số câu trả lời hữu ích ở đây rồi, nhưng có lẽ tôi có thể thêm một lời giải thích chính xác hơn.
Việc giảm số lượng kết quả truy vấn bằng câu lệnh GROUP BY thật dễ dàng miễn là bạn không truy vấn thêm thông tin. Giả sử bạn có bảng 'vị trí' sau đây.
--country-- --city--
France Lyon
Poland Krakow
France Paris
France Marseille
Italy Milano
Bây giờ truy vấn
SELECT country FROM locations
GROUP BY country
sẽ cho kết quả:
--country--
France
Poland
Italy
Tuy nhiên, truy vấn sau đây
SELECT country, city FROM locations
GROUP BY country
... ném lỗi trong MS SQL, vì làm thế nào máy tính của bạn có thể biết thành phố nào trong ba thành phố của Pháp "Lyon", "Paris" hoặc "Marseille" mà bạn muốn đọc trên cánh đồng bên phải "Pháp"?
Để sửa truy vấn thứ hai, bạn phải thêm thông tin này. Một cách để làm điều này là sử dụng các hàm MAX () hoặc MIN (), chọn giá trị lớn nhất hoặc nhỏ nhất trong số tất cả các ứng cử viên. MAX () và MIN () không chỉ áp dụng cho các giá trị số, mà còn so sánh thứ tự chữ cái của các giá trị chuỗi.
SELECT country, MAX(city) FROM locations
GROUP BY country
sẽ cho kết quả:
--country-- --city--
France Paris
Poland Krakow
Italy Milano
hoặc là:
SELECT country, MIN(city) FROM locations
GROUP BY country
sẽ cho kết quả:
--country-- --city--
France Lyon
Poland Krakow
Italy Milano
Các hàm này là một giải pháp tốt miễn là bạn ổn với việc chọn giá trị của mình từ hai đầu của thứ tự chữ cái (hoặc số). Nhưng nếu đây không phải là trường hợp? Giả sử rằng bạn cần một giá trị với một đặc tính nhất định, ví dụ: bắt đầu bằng chữ 'M'. Bây giờ mọi thứ trở nên phức tạp.
Giải pháp duy nhất tôi có thể tìm thấy cho đến nay là đưa toàn bộ truy vấn của bạn vào truy vấn con và xây dựng cột bổ sung bên ngoài nó bằng tay:
SELECT
countrylist.*,
(SELECT TOP 1 city
FROM locations
WHERE
country = countrylist.country
AND city like 'M%'
)
FROM
(SELECT country FROM locations
GROUP BY country) countrylist
sẽ cho kết quả:
--country-- --city--
France Marseille
Poland NULL
Italy Milano
SELECT DISTINCT * FROM table
không làm việc cho bạn?