แบบสอบถามที่ง่ายที่สุดในการเขียนสำหรับ MySQL (ที่มีการตั้งค่า ANSI ไม่เข้มงวด) ใช้การก่อสร้างที่ไม่ได้มาตรฐาน:
SELECT key, value
FROM tableX
GROUP BY key ;
ในเวอร์ชันล่าสุด (5.7 และ 8.0+) ซึ่งเป็นการตั้งค่าที่เข้มงวดและONLY_FULL_GROUP_BY
เป็นค่าเริ่มต้นคุณสามารถใช้ANY_VALUE()
ฟังก์ชันเพิ่มใน 5.7:
SELECT key, ANY_VALUE(value) AS value
FROM tableX
GROUP BY key ;
สำหรับ DBMS อื่น ๆ ที่มีฟังก์ชั่นหน้าต่าง (เช่น Postgres, SQL-Server, Oracle, DB2) คุณสามารถใช้สิ่งเหล่านี้ได้ ข้อดีคือคุณสามารถเลือกคอลัมน์อื่น ๆ ในผลลัพธ์ได้เช่นกัน (นอกเหนือจากkey
และ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 ;
สำหรับเวอร์ชันเก่าของข้างต้นและสำหรับ DBMS อื่น ๆ เป็นวิธีทั่วไปที่ทำงานได้เกือบทุกที่ ข้อเสียอย่างหนึ่งคือคุณไม่สามารถเลือกคอลัมน์อื่นด้วยวิธีนี้ อีกอย่างคือฟังก์ชั่นรวมที่ชอบMIN()
และMAX()
ไม่ทำงานกับบางประเภทข้อมูลในบาง DBMS (เช่นบิต, ข้อความ, blobs):
SELECT key, MIN(value) AS value
FROM tableX
GROUP BY key ;
PostgreSQL มีDISTINCT ON
โอเปอเรเตอร์ที่ไม่ได้มาตรฐานซึ่งสามารถใช้ได้เช่นกัน ตัวเลือกORDER BY
สำหรับการเลือกแถวจากทุกกลุ่มที่ควรเลือก:
SELECT DISTINCT ON (key) key, value
FROM tableX
-- ORDER BY key, <some_other_expressions> ;