Sql İle Top İfadesi Kullanımı - Satır Limiti


28 Ekim 2012 Hikmet Okumuş Microsoft SQL Server

Top ifadesi, select ile görüntülenecek verilerin satır sayısını belirtmek için kullanılmaktadır. Eğer bir select sorgusunda TOP ifadesi geçmezse sorguya göre tabloda bulunan tüm satırlar gelecektir. TOP ifadesi belirtilirse, limit değeri kadar satır görüntülenecektir. Örnek olarak Kullanıcılar tablosunda bulunan kayıtlarımızı getirelim.
SELECT * FROM Kullanicilar
Bu şekilde tüm kullanıcı kayıtları gelecektir. Sorgumuza TOP ifadesini eklediğimizde ise belirtilen miktar kadar satır görüntülenecektir.
SELECT TOP 3 * FROM Kullanicilar
Bu sorguya göre kullanıcılar tablosunda bulunan ilk 3 satır görüntülenecektir. Bu şekilde görüntülemek istediğimiz satır sayısını belirtebilmekteyiz.

Başarılar dilerim.



Kullanıcı Yorumları

hikmet okumuş makale yorum
Osman Tanca
13.01.2021 15:22:57

Hikmet bey selamlar,

Sql üzerinde oluşturduğum tabloyu datagridview içerisine çekiyorum, gelen listede veri türüme göre seçtiğim değerin en yüksek değerini bulmak istiyorum, ne yapmamı önerirsiniz? Bir örnekle açıklamaya çalışırsam;

Code  |   Details
0001  | Pencil
0002  | Paper
0003  | Rubber
tk22  | Battery
tk23  | Glass

Buradaki datagrid tablosunda eğer 0002 no'lu satırı seçersem en yüksek değeri 0003 gelmeli, ve/veya tk22 kodlu ürünü seçersem en yüksek değer tk23 gelmeli gibi..

hikmet okumuş makale yorum
Hikmet Okumuş
16.01.2021 15:44:33

Osman Tanca selamlar,

code alanı varchar tipinde olduğu için özellikle alfanumeric bir alanda order by yapmak her zaman doğru sonuçlar vermez. tk22, tk23 bu verileri order by asc yaparsanız sonuç doğru gelir fakat tk100 değerinide order by a dahil ettiğinizde sonuç hatalı olacaktır. Burada sizin max değer olarak kabul etmeniz gereken bir alan olmalı id alanı ya da oluşturma tarihi gibi. (veri türüne göre son kayıt en büyük code değerine sahiptir kuralına göre doğru çalışır) Sonrasında group by ve partition ile sonuca ulaşabilirsiniz.

hikmet okumuş makale yorum
Osman Tanca
17.01.2021 12:53:58

Hikmet bey açıklama için teşekkürler,

Aşağıdaki gibi yazdığım kodları sizinle paylaşmak istedim, sanıyorum kodlara göre uygun bir tavsiyede bulunabilirsiniz.

Buradaki Variables.sth_fisno değeri başka bir formdaki datagrid tablsounda yer alan seçili satırdaki hücre değerini ifade ediyor.

Variables.sth_fisno = Convert.ToInt32(dgvStokhareketler.SelectedRows[0].Cells[1].Value); 

public void Kod_Uret_Kopyala()

        {

            Stokhareketdetaylar u = new Stokhareketdetaylar();

            conn.Open();

            SqlCommand comm = new SqlCommand("SELECT max(FISNO) from STOKHAREKETLER" + "_" + Sqlbaglanti.sirketID + " WHERE [email protected] ", conn);

            comm.Parameters.Add("@FISNO", SqlDbType.NVarChar).Value = Variables.sth_fisno;

            u.Fisno = Convert.ToString(comm.ExecuteScalar());

            conn.Close();

            if (string.IsNullOrEmpty(u.Fisno))

            {

                txtFisno.Text = "00000000001";

            }

            else

            {

                bool isDigitPresent = u.Fisno.Any(c => char.IsDigit(c));

                if (isDigitPresent == true)

                {

                    int kod = int.Parse(Regex.Replace(u.Fisno, "[^0-9]", "")) + 1;

                    string zeroStr = Regex.Replace(u.Fisno, "[^0-9]", "");

                    string newZeroStr = "";

                    for (int x = 0; x < zeroStr.Length; x++)

                        if (zeroStr[x] == '0') newZeroStr = newZeroStr + "0";

                        else { };

                    string newVal = Regex.Replace(u.Fisno, "[0-9]", "") + newZeroStr + kod;

                    txtFisno.Text = newVal;

                }

                else

                {

                    txtFisno.Focus();

                    txtFisno.Text = Variables.sth_fisno + "01";

                }

            }

        }

hikmet okumuş makale yorum
Hikmet Okumuş
17.01.2021 21:03:37

Sorgunda bir mantık hatası var. Mesela tabloda fisno alanında;

F1
F2
F1
F3
F4

değerleri olsun. sen FisNo = 'F1' dersen, sana 2 satır dönecek ve max, min dediğinde sana gene F1 sonucu döncek, çünkü farklı bir değer yok. Yani bu sorgu aslında exists gibi çalışıyor. Kod üretme mantığında seçilen değeri +1 arttırmak olduğu için hep son satırı seçmen lazım, yoksa mükerrer kodlar üreteceksin. Tavsiyem numarator işlemlerini yönetmen için bir tablo oluşturman. Tablo; NType, Prefix ve Counter şeklinde olabilir.

=======
T1 - A - 0
T2 - B - 0
=======

T1  ->  kod üreteceğin tip.
A   ->  Prefix, A001
0   ->  Son oluşan numara, A001, A002

Numaratorden her yeni numara oluşturmada Counter + 1 yapacaksın ve tabloda kaydı güncelleyeceksin.



Yorum Ekle