Birden fazla index

Firebird ve Interbase veritabanları ve SQL komutlarıyla ilgli sorularınızı sorabilirsiniz. Delphi tarafındaki sorularınızı lütfen Programlama forumunda sorunuz.
Cevapla
Kullanıcı avatarı
pentiumkivanc
Üye
Mesajlar: 350
Kayıt: 19 Şub 2004 10:24
İletişim:

Birden fazla index

Mesaj gönderen pentiumkivanc »

Merhaba;
Acaba iki farklı tablodan iki farklı index yapılabilirmi? Bu tablolardan biri cari kart bilgilerinin olduğu CHK tablosu diğeri ise cari hesap işlemlerinin olduğu CHI tablosu Buna göre CHI da tutulan hesapkodu,karsihesapkodu,tutar bilgilerini sorgulamak istiyorum ancak buradaki hesap kodu ve karşı hesap kodu bilgileri chk da tutuluyor buna göre tablolardaki alanlar şunlar:

Kod: Tümünü seç

____________________________     ____________________________________________
|            CHK           |    |                     CHI                    |
---------------------------     ----------------------------------------------
| Hesapkodu    | Ünvan     |    | Hesapkodu      |  Tutar    | Karsihesapkod |
----------------------------     ---------------------------------------------
| 0001         A şirketi   |    |    0005          1.000.000         0001    |
| 0002         B şirketi   |    |    0003          5.000.000         0002    |
| 0003         C şirketi   |    |    0001          2.500.000         0003    |
----------------------------    ----------------------------------------------
Bunun karşılığında gelen sorgu
Hesapkodu Ünvanı, Karşı hesapkodu Ünvanı, Tutar şeklinde olmalı Ben şu sorguyu yapınca

Select
CHK.Unvan,
CHK.hesapkodu,
CHI.hesapkodu,
CHI.karsihesapkodu,
CHI.TUTAR
FROM CHK,CHI
Where CHK.hesapkod=CHI.Hesapkod

doğal olarak ekrana gelen bilgilerdeki Ünvan bilgisi sadece hesap kodunun ünvan bilgisi oluyor ancak ben karşı hesap kodunun da ünvan bilgisini göstermek istiyorum. Bunu nasıl yapabilirim?
doganzorlu
Kıdemli Üye
Mesajlar: 395
Kayıt: 22 Tem 2004 09:15
Konum: İzmir
İletişim:

Mesaj gönderen doganzorlu »

Selam,

Sanırım aşağıdaki SQL işinizi görür;

Kod: Tümünü seç

SELECT chkout.unvan, chkout.hesapkod, chiout.hesapkodu,
       (SELECT unvan
          FROM chk chkin
         WHERE chkin.hesapkod = chiout.karsihesapkodu) karsiunvan,
       chiout.karsihesapkodu, chiout.tutar
  FROM chk chkout, chiout
 WHERE chkout.hesapkod = chiout.hesapkod
Not: test edemedim eğer bir hata verirse tekrar kontrol ederiz..
Doğan Zorlu, İzmir

------------------------
"Bu Kitap'ı sana yalnız şunun için indirdik: Hakkında ayrılığa düştükleri şeyi onlara iyice açıklayasın ve Kitap, iman eden bir topluluk için kılavuz ve rahmet olsun." (NAHL 64)
Kullanıcı avatarı
Kuri_YJ
Moderator
Mesajlar: 2248
Kayıt: 06 Ağu 2003 12:07
Konum: İstanbul
İletişim:

Mesaj gönderen Kuri_YJ »

Selamlar,

Ben de farklı örnekler vereyim,

Örnek 1 ;

Kod: Tümünü seç


  SELECT A.HESAPKODU AS HESAP_KODU, A.UNVAN AS HESAP_UNVAN,
    H.TUTAR, B.HESAPKODU AS KARSI_HESAP_KODU, B.UNVAN AS KARSI_HESAP_UNVAN
  FROM CHI H, CHK AS A, CHK AS B
  WHERE H.HESAPKODU = A.HESAPKODU AND
             H.KARSIHESAPKOD = B.HESAPKODU
Yukarıdaki örnekte eğer CHI'de HESAPKODU ve KARSIHESAPKODU var olan tüm kayıtlar gelir, eğer birinden biri yoksa o satır gelmez.

Örnek 2 ;

Kod: Tümünü seç


  SELECT A.HESAPKODU AS HESAP_KODU, A.UNVAN AS HESAP_UNVAN,
    H.TUTAR, B.HESAPKODU AS KARSI_HESAP_KODU, B.UNVAN AS KARSI_HESAP_UNVAN
  FROM CHI H, CHK AS A, CHK AS B
  WHERE H.HESAPKODU = A.HESAPKODU AND
             H.KARSIHESAPKOD *= B.HESAPKODU

Yukarıdaki örnekte ise, eğer CHI'de hesap kodu var olan tüm kayıtlar gelir, KarsiHesapKod field'ında değer olsun veya olmasın.

Örnek 3 ;

Kod: Tümünü seç


  SELECT A.HESAPKODU AS HESAP_KODU, A.UNVAN AS HESAP_UNVAN,
    H.TUTAR, B.HESAPKODU AS KARSI_HESAP_KODU, B.UNVAN AS KARSI_HESAP_UNVAN
  FROM CHI H, CHK AS A, CHK AS B
  WHERE H.HESAPKODU *= A.HESAPKODU AND
             H.KARSIHESAPKOD *= B.HESAPKODU

Yukarıdaki örnekte ise CHI'deki tüm hareketler gelir. Yani HesapKodu veya KarsiHesapKod fieldlarında değer olsun veya olmasın CHI'de kayıt var ise gelir. Diğerlerinin olup olmadığı ile ilgilenilmez.

Böyle birden fazla tabledaki verileri bir sorguda çıkarma yöntemlerine JOIN işlemleri denir. 2. ve 3. örnekte verdiğimiz JOIN tipleri ise OUTER JOIN olarak bilinirler. Bunlar ile ilgili dokumanları okursanız INNER, LEFT, RIGHT, OUTER gibi türleri olduğunu göreceksiniz ve 4GL DB'lerin en güzel özelliklerinden biridir.

Kolay Gelsin.
Kuri Yalnız Jedi
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
Kullanıcı avatarı
Kuri_YJ
Moderator
Mesajlar: 2248
Kayıt: 06 Ağu 2003 12:07
Konum: İstanbul
İletişim:

Mesaj gönderen Kuri_YJ »

Pardon 4GL DB dedim :) RDBMS diyecektim :)

Kolay Gelsin
Kuri Yalnız Jedi
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
Kullanıcı avatarı
pentiumkivanc
Üye
Mesajlar: 350
Kayıt: 19 Şub 2004 10:24
İletişim:

Mesaj gönderen pentiumkivanc »

Teşekkür ederim tam istediğim gibi
name
Kıdemli Üye
Mesajlar: 243
Kayıt: 09 Ağu 2003 02:11
Konum: İstanbul

Mesaj gönderen name »

İyi çalışmalar

@Kuri_TLJ verdiğiniz örnekteki '*=' operatorü firebird'de çalışmıyor. Aynı görevi görecek başka bir operatör kullanılabilir mi?
Kullanıcı avatarı
selimr
Üye
Mesajlar: 556
Kayıt: 16 Eki 2003 02:07

Mesaj gönderen selimr »

bu yapıyı sürekli kullanacaksan
bir görünüm ( view ) oluşturman daha pratik olur bence.
Kullanıcı avatarı
Kuri_YJ
Moderator
Mesajlar: 2248
Kayıt: 06 Ağu 2003 12:07
Konum: İstanbul
İletişim:

Mesaj gönderen Kuri_YJ »

Selamlar,

Firebird'de *= gibi kullanımlar yerine OUTER JOIN ifadesi kullanmak gerekiyor.

Kolay Gelsin.
Kuri Yalnız Jedi
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
name
Kıdemli Üye
Mesajlar: 243
Kayıt: 09 Ağu 2003 02:11
Konum: İstanbul

Mesaj gönderen name »

Teşekkürler @Kuri_TLJ
Cevapla