Bu tür sorguları kafa karıştırıcı ayrı veriler tanımlamak yerine, SQL Server'a aşina herkesin bilgisi dahilinde 🎯 olan en basit veri tabanı olduğu için Northwind veri tabanı üzerinde göstermeyi tercih ediyorum. SQL Server TOP sorgularında kullanabileceğimiz argümanlardan bir tanesi WITH TIES diğeri PERCENT kullanımıdır. Kullanım örneği için öncelikle fiyat sıralı 📈 ürünlerin listesini alalım.

    select * from Products order by UnitPrice
Northwind Products{{lightbox=sql}}

Örneğin ücreti 14.00 olan 4 adet ürün olduğunu gözle görebiliyoruz. Ama tabi milyonlarca satırlık bir tablo olduğunu farzedersek tekrarlayan fiyatların sayısını almamız gerekir.

    select 
        UnitPrice,
        count(UnitPrice) as PriceCount
    from Products
    group by
        UnitPrice
    order by 2 desc
Northwind Products group by Price{{lightbox=sql}}

Şu anda ücreti 14.00 olan 4 adet ürün olduğunu kesin bir şekilde biliyoruz. Ancak select top 3 UnitPrice,* from Products where UnitPrice=14 sorgusunu gönderirsek 4 yerine 3 satır sonuç alırız çünkü implicitly bir şekilde tüm gelen satırları değil sadece 3 satırı istedik. Bunu explicitly belirttiğimiz satır dışında kayıt varsa onları da getirmek için kullanılan çözüm WITH TIES argümanıdır.

    select top 3 UnitPrice,* from Products where UnitPrice=14
Northwind Top Products by Price

Eşleşen tüm satırlar için WITH TIES kullanırız. Bu durumda açık bir şekilde TOP 3 gönderilmesine rağmen 4 satır sonuç döndürülecektir.

    select top 3 with ties UnitPrice,* from Products where UnitPrice=14 order by 1
Northwind Top with ties Products by Price

Bu konu ile ilgili Microsoft dökümanlarında aşağıdaki satırlar yer alır.

Returns two or more rows that tie for last place in the limited results set. You must use this argument with the ORDER BY clause. WITH TIES might cause more rows to be returned than the value specified in expression. For example, if expression is set to 5 but two additional rows match the values of the ORDER BY columns in row 5, the result set will contain seven rows.

You can specify the TOP clause with the WITH TIES argument only in SELECT statements, and only if you've also specified the ORDER BY clause. The returned order of tying records is arbitrary. ORDER BY doesn't affect this rule.

Sonuç olarak,

  • WITH TIES kullanırsanız, TOP ile özellikle kaç satır istediğinizi belirtseniz dahi eğer daha fazla satır sonuç kümesi mevcutsa hepsi beraber döndürülür.
  • TOP kullanmadan WITH TIES kullanamazsınız.
  • ORDER BY kullanmadan WITH TIES kullanamazsınız.
  • ORDER BY kullanıyor olsak da satırlar rastgele bir sırada gelecektir.

TOP (Transact-SQL) ArgumentsWhat is the use of WITH TIES keyword in SELECT statement in SQL Queries?