none
Sql sorgusunda tekrarlanan kayıtlar RRS feed

  • Soru

  • Merhabalar sql sorgumda tekrarlanan kayıtları istiyorum ama biraz detaylı olarak, sorgunun üzerinde bayağı uğraştım ama oluşturamadım yardımlarınızı bekliyorum

    hareketler adında bir tablom var ve kolonlarım şu şekilde: no(int),personelid(int),tarih(date),saat(time(7))

    sorgu ile aynı tarihte tekrarlanan personelid numaraları varsa bunları listelemek

    SELECT        no, personelid, tarih,saat
    FROM            hareketler
    WHERE        (tarih IN
                                 (SELECT        tarih
                                   FROM            hareketler AS hareketler_1
                                   GROUP BY tarih
                                   HAVING         (COUNT(tarih) > 1)))

    burda sadece aynı günde olan kayıtları listeletebildim aynı gün içinde tek personelid olan kayıtlarda görünüyor ben sadece aynı günde tekrarlanan personelid leri çekmek istiyorum, yardımlarınız için teşekkürler.



    • Düzenleyen sevko17 10 Şubat 2019 Pazar 16:41
    10 Şubat 2019 Pazar 15:28

Yanıtlar

  • SELECT h.no, h.personelid, h.tarih, h.saat
    FROM hareketler H
    inner join (
     SELECT  personelId, tarih
     FROM    hareketler
     GROUP BY personelId, tarih
     HAVING  COUNT(*) > 1
    ) D
    on H.personelId = D.PersonelId And
       H.Tarih = D.Tarih;
    
    

    • Yanıt Olarak İşaretleyen sevko17 10 Şubat 2019 Pazar 22:23
    10 Şubat 2019 Pazar 19:09
  • EXISTS kullanarak farklı bir kod oluşturulabilir ama sonucun pek değişeceğini sanmam.

    (1 milyon kayıt ile kendi makinemde denedim, her iki yöntemle de olusturulan plan ayni ve 2-3sn kadar sürüyor).

    Herhalde bundan daha hızlı sonuclar icin, ya subquery kismini bir tablo olarak saklayıp guncellerdim, ya da MS SQL Server disinda bir database kullanırdım.

     

    • Yanıt Olarak İşaretleyen sevko17 17 Şubat 2019 Pazar 10:31
    13 Şubat 2019 Çarşamba 15:08

Tüm Yanıtlar

  • SELECT h.no, h.personelid, h.tarih, h.saat
    FROM hareketler H
    inner join (
     SELECT  personelId, tarih
     FROM    hareketler
     GROUP BY personelId, tarih
     HAVING  COUNT(*) > 1
    ) D
    on H.personelId = D.PersonelId And
       H.Tarih = D.Tarih;
    
    

    • Yanıt Olarak İşaretleyen sevko17 10 Şubat 2019 Pazar 22:23
    10 Şubat 2019 Pazar 19:09
  • Teşekkür ederim verdiğiniz kod işime yaradı. Vermiş olduğunuz kodda D değişkeni inner join sayesinde mi tanımlanıyor tam anlamadım, kullanımı farklı geldi.
    10 Şubat 2019 Pazar 22:22
  • subquery ,cte ve derived table konu başlıklarını inceleyebilirsiniz . 


    Altan Özdemir

    11 Şubat 2019 Pazartesi 09:20
  • Kullanımı cok yaygın. Ona lokal alias deniyor. Oradaki D (...) icindeki subquery icin bir alias ve orada bir alias olmak zorunda, yani farklı bir kullanım degil. O olmadan kullanım sekli yok, varsa da ben bilmiyorum. H ise yine lokal bir alias, uzun uzun hareketler yazmak yerine, o olmasa da olurdu.   
    11 Şubat 2019 Pazartesi 11:27
  • Yanıtlarınız için teşekkür ederim. Tablomda kayıt sayısı milyonu geçecek,aynı işe yarayan bundan daha hızlı bir sorgu olabilir mi sizce ?

    • Düzenleyen sevko17 12 Şubat 2019 Salı 19:13
    12 Şubat 2019 Salı 19:12
  • EXISTS kullanarak farklı bir kod oluşturulabilir ama sonucun pek değişeceğini sanmam.

    (1 milyon kayıt ile kendi makinemde denedim, her iki yöntemle de olusturulan plan ayni ve 2-3sn kadar sürüyor).

    Herhalde bundan daha hızlı sonuclar icin, ya subquery kismini bir tablo olarak saklayıp guncellerdim, ya da MS SQL Server disinda bir database kullanırdım.

     

    • Yanıt Olarak İşaretleyen sevko17 17 Şubat 2019 Pazar 10:31
    13 Şubat 2019 Çarşamba 15:08
  • Verdiğiniz bilgiler için teşekkür ederim, o zaman bu kod işimi görecek en azından problem yaşayana kadar :)
    17 Şubat 2019 Pazar 10:32