นั่นเป็นคำถามที่ดีจริงๆ ฉันได้อ่านคำตอบที่มีประโยชน์แล้วที่นี่ แต่ฉันอาจเพิ่มคำอธิบายที่แม่นยำยิ่งขึ้นได้
การลดจำนวนผลการสืบค้นด้วยคำสั่ง GROUP BY นั้นง่ายตราบใดที่คุณไม่ต้องค้นหาข้อมูลเพิ่มเติม สมมติว่าคุณมี 'ตำแหน่ง' ของตารางต่อไปนี้
--country-- --city--
France Lyon
Poland Krakow
France Paris
France Marseille
Italy Milano
ตอนนี้แบบสอบถาม
SELECT country FROM locations
GROUP BY country
จะส่งผลให้:
--country--
France
Poland
Italy
อย่างไรก็ตามแบบสอบถามดังต่อไปนี้
SELECT country, city FROM locations
GROUP BY country
... แสดงข้อผิดพลาดใน MS SQL เพราะคอมพิวเตอร์ของคุณจะรู้ได้อย่างไรว่าในสามเมืองของฝรั่งเศส "Lyon", "Paris" หรือ "Marseille" ที่คุณต้องการอ่านในช่องทางด้านขวาของ "France"
ในการแก้ไขแบบสอบถามที่สองคุณต้องเพิ่มข้อมูลนี้ วิธีหนึ่งในการทำเช่นนี้คือการใช้ฟังก์ชั่น MAX () หรือ MIN () โดยเลือกค่าที่มากที่สุดหรือน้อยที่สุดในบรรดาผู้สมัครทั้งหมด MAX () และ MIN () ไม่เพียงใช้กับค่าตัวเลขเท่านั้น แต่ยังเปรียบเทียบลำดับตัวอักษรของค่าสตริง
SELECT country, MAX(city) FROM locations
GROUP BY country
จะส่งผลให้:
--country-- --city--
France Paris
Poland Krakow
Italy Milano
หรือ:
SELECT country, MIN(city) FROM locations
GROUP BY country
จะส่งผลให้:
--country-- --city--
France Lyon
Poland Krakow
Italy Milano
ฟังก์ชั่นเหล่านี้เป็นทางออกที่ดีตราบใดที่คุณไม่ต้องกังวลกับการเลือกค่าของคุณจากทั้งสองด้านของลำดับตัวอักษร (หรือตัวเลข) แต่ถ้าไม่ใช่ในกรณีนี้ล่ะ? ให้เราสมมติว่าคุณต้องการค่าที่มีลักษณะบางอย่างเช่นเริ่มต้นด้วยตัวอักษร 'M' ตอนนี้ทุกอย่างซับซ้อนขึ้น
ทางออกเดียวที่ฉันสามารถค้นหาได้คือใส่แบบสอบถามทั้งหมดของคุณลงในแบบสอบถามย่อยและสร้างคอลัมน์เพิ่มเติมด้วยตนเอง:
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
จะส่งผลให้:
--country-- --city--
France Marseille
Poland NULL
Italy Milano
SELECT DISTINCT * FROM table
ได้ผลสำหรับคุณ