Bu gerçekten iyi bir soru. Burada zaten bazı yararlı cevapları okudum, ama muhtemelen daha kesin bir açıklama ekleyebilirim.
Ek bilgileri sorgulamadığınız sürece sorgu sonuçlarının sayısını GROUP BY deyimiyle azaltmak kolaydır. Diyelim ki aşağıdaki tablodaki 'yerleri' var.
--country-- --city--
France Lyon
Poland Krakow
France Paris
France Marseille
Italy Milano
Şimdi sorgu
SELECT country FROM locations
GROUP BY country
sonuçlanacak:
--country--
France
Poland
Italy
Ancak, aşağıdaki sorgu
SELECT country, city FROM locations
GROUP BY country
... MS SQL'de hata veriyor, çünkü bilgisayarınız "Fransa" nın sağındaki alanda okumak için üç Fransız şehri "Lyon", "Paris" veya "Marsilya" dan hangisini nasıl bilebilir?
İkinci sorguyu düzeltmek için bu bilgileri eklemelisiniz. Bunu yapmanın bir yolu, tüm adaylar arasında en büyük veya en küçük değeri seçerek MAX () veya MIN () işlevlerini kullanmaktır. MAX () ve MIN () yalnızca sayısal değerler için geçerli değildir, aynı zamanda dize değerlerinin alfabetik sırasını da karşılaştırır.
SELECT country, MAX(city) FROM locations
GROUP BY country
sonuçlanacak:
--country-- --city--
France Paris
Poland Krakow
Italy Milano
veya:
SELECT country, MIN(city) FROM locations
GROUP BY country
sonuçlanacak:
--country-- --city--
France Lyon
Poland Krakow
Italy Milano
Bu işlevler, alfabetik (veya sayısal) sıranın her iki ucundan değerinizi seçmenizle iyi olduğunuz sürece iyi bir çözümdür. Peki ya durum böyle değilse? Diyelim ki belirli bir karakteristik değere, örneğin 'M' harfinden başlayarak bir değere ihtiyacınız var. Şimdi işler karmaşıklaşıyor.
Şimdiye kadar bulabildiğim tek çözüm, tüm sorgunuzu bir alt sorguya koymak ve bunun dışında ek sütunu el ile oluşturmaktır:
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
sonuçlanacak:
--country-- --city--
France Marseille
Poland NULL
Italy Milano
SELECT DISTINCT * FROM table
senin için çalışmıyor?