Truy vấn dễ nhất để viết là dành cho MySQL (với các cài đặt ANSI không nghiêm ngặt). Nó sử dụng cấu trúc phi tiêu chuẩn:
SELECT key, value
FROM tableX
GROUP BY key ;
Trong phiên bản gần đây (5.7 và 8.0+) trong đó các cài đặt nghiêm ngặt và ONLY_FULL_GROUP_BY
là mặc định, bạn có thể sử dụng ANY_VALUE()
chức năng, được thêm vào 5.7:
SELECT key, ANY_VALUE(value) AS value
FROM tableX
GROUP BY key ;
Đối với các DBMS khác, có các chức năng cửa sổ (như Postgres, SQL-Server, Oracle, DB2), bạn có thể sử dụng chúng như thế này. Ưu điểm là bạn cũng có thể chọn các cột khác trong kết quả (bên cạnh key
và value
):
SELECT key, value
FROM tableX
( SELECT key, value,
ROW_NUMBER() OVER (PARTITION BY key
ORDER BY whatever) --- ORDER BY NULL
AS rn --- for example
FROM tableX
) tmp
WHERE rn = 1 ;
Đối với các phiên bản cũ hơn ở trên và cho bất kỳ DBMS nào khác, một cách chung hoạt động gần như ở mọi nơi. Một nhược điểm là bạn không thể chọn các cột khác với phương pháp này. Một điều nữa là các hàm tổng hợp thích MIN()
và MAX()
không hoạt động với một số kiểu dữ liệu trong một số DBMS (như bit, văn bản, đốm màu):
SELECT key, MIN(value) AS value
FROM tableX
GROUP BY key ;
PostgreSQL có một DISTINCT ON
toán tử phi tiêu chuẩn đặc biệt cũng có thể được sử dụng. Tùy chọn ORDER BY
là để chọn hàng nào trong mỗi nhóm nên được chọn:
SELECT DISTINCT ON (key) key, value
FROM tableX
-- ORDER BY key, <some_other_expressions> ;