none
Sql Komutunu bir türlü oluşturamıyorum... RRS feed

  • Soru

  • Arkadaşlar elimde bir proje var ve belki de çok basit ama tamamen kafamın durduğu ve bir türlü oluşturamadığım bir sql komutu var yardımlarını bekliyorum...

    Şimdi bir tane Oda Tablom var (ufak bir otel otomasyonu için).. Bu tabloda oda numarası ve bilgiler var detayları yazıyorum..

    TABLO ADI: Odalar

    OdaNoID int,
    OdaNumara nvarchar(3),
    OdaKat nvarchar(2) ..... gerisi mühim değil..

    TABLO ADI: RezervasyonKayitlari

    KayitID int,
    OdaNoID int,
    GirisTarihi datetime,
    CikisTarihi datetime

    RezervasyonKayıtları tablosunda sadece ileri tarihli rezervasyonlar ve giriş çıkış tarihleri var.. Tüm rezervasyonlar ileri tarihli rezervasyonlar.. Yani rezervasyon günü geldiğinde kayıt bu tablodan siliniyor ve aynı zamanda rezervasyon iptal olduğunda da bu tablodan siliniyor.. Sadece ileri tarihli rezervasyonlar mevcut..

    İstediğim ise,
    Girilen giriş ve çıkış tarihlerinin arasındaki günlerde çakışan bir rezervasyon var mı yok mu.. eğer yoksa o odanın odalar tablosundaki tüm değerlerini getirsin istiyorum hepsi bu..Ama bir takım sorunlar oluyor.. Şimdi mesela rezervasyonlar silindiği için bu tabloda bazen bir oda numarasına ait kayıt bulunmayabilir veya 10 tane de bulunabilir.. Bu da yazdığım komutun sorun yaratmasını sağlıyor..

    her odanın bir kayıtı olduğunda aşağıdaki sql komutu ile odalar geliyor.. fakat hiç kayıt olmadığında da o odanın boş olarak gelmesi lazım.. bu konuda yardımcı olabilirseniz sevinirim.. ya da tablo düzeninde değişiklikle yeni bir komut ile bu işin altından kalkmamı sağlayan bir kod verilirse sevinirim.. Teşekürler..

    create proc sp_BosOdaGetir
    @GirisTarihi datetime,
    @CikisTarihi datetime
    as
    select o.OdaNumara,o.OdaKat from Odalar as o
    inner join RezervasyonKayitlari as r on r.OdaNoID=o.OdaNoID
    where ((r.GirisTarihi>@GirisTarihi and r.GirisTarihi>@CikisTarihi)
    OR
    (r.CikisTarihi<@GirisTarihi and r.CikisTarihi < @CikisTarihi))


    29 Ağustos 2012 Çarşamba 12:51

Yanıtlar

  • Bence aşağı değindiğim konuları tekrar gözden geçirmek gerekiyor:

    - OdaNumara alanının veritipi neden NVARCHAR? Neden Tinyint (şayet oda sayısı <=255 ise eğer > ise Smallint) değil? Rakamdan başka değerler mi içeriyor?

    - Neden OdaKat veritipi NVARCHAR? Muhtemelen 255 kattan daha büyük değildir bina, neden Tinyint değil?

    Bu alanları sayısal yaparsan, hem Indexleme daha verimli olur, hem de bir yerlerde yanlışlıkla Implicit Conversion yapmamış olursun ve makineyi dağıtmazsın.

    Bunlardan başka, kayıt silinmesi olayına değinmeden geçmemek gerekiyor. Bence kayıt silinmemeli, silinmiş olarak işaretlenmelidir. Bir kayıdı DELETE ile silmeni tavsiye etmiyorum, bunun yerine örneğin KayitDurumu adında bir alan tanımlarsın, veritipini de BIT yaparsın ve örneğin kayıt silinecekse 1 olarak işaretlersin... Böylece önceden öyle bir rezervasyon var mı, yok mu iptal edilmiş olsa bile (yani 1 olarak işaretlenmiş) bilirsin.

    Bence bu değişiklikleri bir düşün ve gerekli gördüğün değişiklikleri yap. Ondan sonra mantığı bir daha düşün, belki daha kolaylaşır işin.


    Ekrem Önsoy - MCDBA, MCITP:DBA+DBD, MCSD.Net, MCSE, ITILv3 | http://ekremonsoy.blogspot.com

    • Yanıt Olarak İşaretleyen Ekrem Önsoy 30 Ağustos 2012 Perşembe 20:36
    29 Ağustos 2012 Çarşamba 13:49

Tüm Yanıtlar

  • Bence aşağı değindiğim konuları tekrar gözden geçirmek gerekiyor:

    - OdaNumara alanının veritipi neden NVARCHAR? Neden Tinyint (şayet oda sayısı <=255 ise eğer > ise Smallint) değil? Rakamdan başka değerler mi içeriyor?

    - Neden OdaKat veritipi NVARCHAR? Muhtemelen 255 kattan daha büyük değildir bina, neden Tinyint değil?

    Bu alanları sayısal yaparsan, hem Indexleme daha verimli olur, hem de bir yerlerde yanlışlıkla Implicit Conversion yapmamış olursun ve makineyi dağıtmazsın.

    Bunlardan başka, kayıt silinmesi olayına değinmeden geçmemek gerekiyor. Bence kayıt silinmemeli, silinmiş olarak işaretlenmelidir. Bir kayıdı DELETE ile silmeni tavsiye etmiyorum, bunun yerine örneğin KayitDurumu adında bir alan tanımlarsın, veritipini de BIT yaparsın ve örneğin kayıt silinecekse 1 olarak işaretlersin... Böylece önceden öyle bir rezervasyon var mı, yok mu iptal edilmiş olsa bile (yani 1 olarak işaretlenmiş) bilirsin.

    Bence bu değişiklikleri bir düşün ve gerekli gördüğün değişiklikleri yap. Ondan sonra mantığı bir daha düşün, belki daha kolaylaşır işin.


    Ekrem Önsoy - MCDBA, MCITP:DBA+DBD, MCSD.Net, MCSE, ITILv3 | http://ekremonsoy.blogspot.com

    • Yanıt Olarak İşaretleyen Ekrem Önsoy 30 Ağustos 2012 Perşembe 20:36
    29 Ağustos 2012 Çarşamba 13:49
  • Cevap verdiğiniz için teşekür ederim.. OdaNumarasını nvarchar yapmamın sebebi ileride adamların numaraların başına bir harf ekleyebilme ihtimalini söylediklerinden dolayı var.. Odaların bir takım özelliklerini direk olarak belli edebilecek harf koyabileceklerini söyledikleri için yaptım.. Kat olayını da belki ileride rakam olarak değil de kelime olarak da yazabileceklerini söylediler.. Yani müşteri istekleri doğrultusunda oldu.. Yoksa dediğiniz konuda gerçekten haklısınız..

    Tablo düzeni öneriniz için de teşekkür ederim. Onu deneyeceğim..

    Saygılar.


    • Düzenleyen Emre Bnzr 29 Ağustos 2012 Çarşamba 14:41
    29 Ağustos 2012 Çarşamba 14:41