none
Sql Server' da böyle bir sorgu oluşturulabilir mi ? RRS feed

  • Soru

  • Merhaba,
    Repeater la bir iç içe kategori oluşturdum.

    (Hesabım Onaylanmadığından Resim Ekliyemiyorum)

    Burada tablomun resmi vardır .


    Alt kategorisi 0 olan ana kategori,

    Ana Kategorisi 1 olanlar da Yüzüklerin Alt Kategorisi dir. tablomun mantığı budur.

    <asp:Repeater ID="rpAnaKategori" OnItemDataBound="rpAnaKategori_ItemDataBound" runat="server">
                            <ItemTemplate>
                                <li class="nav-open">+ <a href="Urunler.aspx?KategoriId=<%#Eval ("Id") %>"><%#Eval ("KategoriAdi") %></a>
                                    <ul>
                                        <asp:Repeater ID="rpAltKategori" runat="server">
                                            <ItemTemplate>
                                                <li><a href="Urunler.aspx?KategoriId=<%#Eval ("Id") %>"><%#Eval ("KategoriAdi") %></a></li>
                                            </ItemTemplate>
                                        </asp:Repeater>
                                    </ul>
                                </li>
                            </ItemTemplate>
                        </asp:Repeater>

    Yukarıdaki Kodla Sıralamamı yapıyorum.

    Veri tabanından da Alttaki kodla verimi çekiyorum.

    public void Kategori()
        {
            try
            {
                SqlDataReader rd = Baglan.Reader("SELECT * FROM Kategoriler Where AltKategori = 0");
                rpAnaKategori.DataSource = rd;
                rpAnaKategori.DataBind();
            }
            catch
            {
    
            }
            finally
            {
                Baglan.Kapa();
            }
        }
    protected void Page_Load(object sender, EventArgs e)
        {
            Kategori();
        }
        protected void rpAnaKategori_ItemDataBound(object source, RepeaterItemEventArgs e)
        {
            SqlConnection baglanti = new SqlConnection("server=.;database=e-arvagold;trusted_connection=true;");
            try
            {
                Repeater rp = (Repeater)e.Item.FindControl("rpAltKategori");
                SqlCommand cmdAltKat = new SqlCommand("Select * from Kategoriler where AnaKategorisi=" + Convert.ToInt32(DataBinder.Eval(e.Item.DataItem, "Id").ToString()), baglanti);
                baglanti.Open();
                rp.DataSource = cmdAltKat.ExecuteReader();
                rp.DataBind();
                cmdAltKat.Dispose();
            }
            catch
            {
    
            }
            finally
            {
                baglanti.Close();
            }
        }

    Şimdi ben Ana kategoriye tıkladığımda Urunler sayfasında KategoriId si 1 (yani yüzükleri) çekiyorum.
    Lakin Yüzüklerin alt kategorisi olan Pırlanta Yüzüklere tıkladığımda nasıl sql den bunu çektirmem gerekiyor orada sıkıntı yaşıyorum.

    Yani Ana Kategorisi 1(Yüzükler) olan verileri çekip içinden de Kategori Id si 7(Pırlanta Yüzükler) olanları nasıl listeliceğim. 
    Bunu nasıl bir sql cümleciğiyle yapacağım. 

    Şimdiden Teşekkür Ederim İlgilenen Herkese...



    24 Aralık 2013 Salı 15:01

Yanıtlar

  • Keske resim verecegine biraz zahmete katlanip o tabloyu kod seklinde verseydin. Neyse, bu senin yapmak istediginin ornegi SQL Server BOL'da var. F1 tusuna bas ve index'te "CTEs" konusuna bak. Kabaca soyle (altKategori alanine niye gerek duydugunu anlamadim):

    with UrunAgaci ( id, ad, seviye, sira )
    as
    (
    select convert( varchar(255), KategoriAd ) as ad,
       id, 1 as Seviye,
       convert( varchar(255), KategoriAd ) as sira
    from Urunler
    union all
    select 
    convert( varchar(255), replicate('|   ', seviye) + KategoriAd ),
       id, Seviye+1,
       convert( varchar(255), rtrim(sira) + replicate('|   ', seviye) + KategoriAd )
    from Urunler u
    join UrunAgaci ua on ua.Id = u.anaKategorisi
    )
    select Ad, id from UrunAgaci
    order by Sira;

    Ote yandan senin kodun C# kodu. Linq kullansaydin daha kolay olurdu diye dusunuyorum. Northwind ornek tablosunu ele alirsak:

    void Main()
    {
      ListThemAll( Employees.AsEnumerable(), 0 );
    }
    
    private void ListThemAll( IEnumerable<Employees> e, int level )
    {
      foreach (var emp in e)
      {
          Console.WriteLine ("{0}{1}", "".PadRight(level,'\t'), emp.FirstName+" "+emp.LastName);
          if (emp.ReportsToChildren.Count > 0)
          {
            ListThemAll( emp.ReportsToChildren, level + 1);
          }
      }
    }

    Ciktisi:

    Nancy Davolio             
    Andrew Fuller
      Nancy Davolio             
      Janet      Leverling
      Margaret Peacock
      Steven Buchanan
        Michael Suyama
        Robert King
        Anne Dodsworth
      Laura Callahan
    Janet      Leverling
    Margaret Peacock
    Steven Buchanan
      Michael Suyama
      Robert King
      Anne Dodsworth
    Michael Suyama
    Robert King
    Laura Callahan
    Anne Dodsworth
    

    • Yanıt Olarak İşaretleyen Özgür Tekbaş 30 Aralık 2013 Pazartesi 12:45
    25 Aralık 2013 Çarşamba 11:19

Tüm Yanıtlar

  • Burada   tablomun resmi vardır .
    24 Aralık 2013 Salı 15:04
  • create view v_Kategoriler as

    SELECT ID,KategoriAdi

    FROM Kategoriler

    where AltKategori=0

    create view v_AltKategori as

    SELECT ID,KategoriAdi,AnaKategorisi FROM Kategoriler WHERE AltKategori=1

    şeklinde 2 view oluşturun ve bu viewları

    ID=AnaKategori şeklide JOIN leyin

    25 Aralık 2013 Çarşamba 08:33
  • Öncelikle cevap verdiğiniz için teşekkür eerim. Benim burdaki amacım Alt kategori öpesi olan herhangi bir öğeye tıkladığımda o ürünü cektimek *Yüzükler -Pırlanta Yüzük -Elmas Yüzük *Küpeler -Pırlanta Küpe -Elmas Küpe bu şekilde alt alta bir kategorilemede Pırlanta yüzüğe tıkladığımda pırlanta yüzük olanlar açılsın ben viewleri oluşturdum ama join liyerek bu sorunumu çözebilicekmiyim. denedim ama başaramadım yardımcı olursanız sewınırım.
    25 Aralık 2013 Çarşamba 09:35
  • Keske resim verecegine biraz zahmete katlanip o tabloyu kod seklinde verseydin. Neyse, bu senin yapmak istediginin ornegi SQL Server BOL'da var. F1 tusuna bas ve index'te "CTEs" konusuna bak. Kabaca soyle (altKategori alanine niye gerek duydugunu anlamadim):

    with UrunAgaci ( id, ad, seviye, sira )
    as
    (
    select convert( varchar(255), KategoriAd ) as ad,
       id, 1 as Seviye,
       convert( varchar(255), KategoriAd ) as sira
    from Urunler
    union all
    select 
    convert( varchar(255), replicate('|   ', seviye) + KategoriAd ),
       id, Seviye+1,
       convert( varchar(255), rtrim(sira) + replicate('|   ', seviye) + KategoriAd )
    from Urunler u
    join UrunAgaci ua on ua.Id = u.anaKategorisi
    )
    select Ad, id from UrunAgaci
    order by Sira;

    Ote yandan senin kodun C# kodu. Linq kullansaydin daha kolay olurdu diye dusunuyorum. Northwind ornek tablosunu ele alirsak:

    void Main()
    {
      ListThemAll( Employees.AsEnumerable(), 0 );
    }
    
    private void ListThemAll( IEnumerable<Employees> e, int level )
    {
      foreach (var emp in e)
      {
          Console.WriteLine ("{0}{1}", "".PadRight(level,'\t'), emp.FirstName+" "+emp.LastName);
          if (emp.ReportsToChildren.Count > 0)
          {
            ListThemAll( emp.ReportsToChildren, level + 1);
          }
      }
    }

    Ciktisi:

    Nancy Davolio             
    Andrew Fuller
      Nancy Davolio             
      Janet      Leverling
      Margaret Peacock
      Steven Buchanan
        Michael Suyama
        Robert King
        Anne Dodsworth
      Laura Callahan
    Janet      Leverling
    Margaret Peacock
    Steven Buchanan
      Michael Suyama
      Robert King
      Anne Dodsworth
    Michael Suyama
    Robert King
    Laura Callahan
    Anne Dodsworth
    

    • Yanıt Olarak İşaretleyen Özgür Tekbaş 30 Aralık 2013 Pazartesi 12:45
    25 Aralık 2013 Çarşamba 11:19
  • create view v_Kategoriler as

    SELECT ID,KategoriAdi

    FROM Kategoriler

    where AltKategori=0

    create view v_AltKategori as

    SELECT ID,KategoriAdi,AnaKategorisi FROM Kategoriler WHERE AltKategori=1

    şeklinde 2 view oluşturun ve bu viewları

    ID=AnaKategori şeklide JOIN leyin

    Select A.KategoriAdi, K.KategoriAdi From v_Kategoriler K Inner Join v_AltKategori A on K.ID = A.AnaKategorisi 

    Bu Şekilde Birleştirdim ama sorunumu hala çözemedim yardımcı olursanız gerçekten sewinirim.

    25 Aralık 2013 Çarşamba 11:36
  • 4 ayda kendi başıma c# ve Sql öğrendim. Cok ileriye gidmedim ama ben burada öğrenmeye çalışıyorum. Bunu cıktıyı bende alabiliyorum ama beni yanlış anlamışsınız. şimdi sizin verdiğiniz örnek üzerinden gideyim. 

    Steven Buchanan nı Ana Kategori Varsayalım ve tıkladığımızda ürünleri listelesin eticaret site mantığıyla. Michael Suyama da alt kategorisi olsun Buna tıkladığımızda ürünleri listeletemiyorum. 

    25 Aralık 2013 Çarşamba 12:03
  • Tamam iste yukarida kodunu verdim ona gore yapabilirsin.
    25 Aralık 2013 Çarşamba 12:24
  • Özür dilerim şöyle söylim yazdığınız kodu anlamaya çalışıyorum ama başaramadım yinede yardım ettıgınız ıcın teşekkurler.

    25 Aralık 2013 Çarşamba 13:55