SQL sorgusu(Join)

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
Uğur1982
Üye
Mesajlar: 383
Kayıt: 11 Mar 2005 03:18
Konum: İzmir

SQL sorgusu(Join)

Mesaj gönderen Uğur1982 »

merhaba arkadaşlar;

Join'le alakalı bir sorguda takıldım.Sizlerin de fikirlerini alayım dedim :D

Tablo isimleri:

:arrow: STOKHAREKET======== :arrow: CARIKART

* Stokhareket_ID=========* Cari_ID
* Cari_ID===============* Cari_Kod
* Stok_ID
* Arac_ID


:arrow: STOKKART=========== :arrow: CARIKODTANIM

* Stok_ID================= * Arac_ID
* Stok_Kod ================ *Arac_Kod
* Stok_Adi================= *Arac_Adi

:arrow: * _ID' lerin hepsi = Integer
:arrow: *_Adi,*_Kod = Varchar 20
:arrow: vt = FireBird 1.5


Asıl sorgulamak istediğim tablo :duvar: :arrow: STOKHAREKET
Sorgum ise örnek olarak;

Kod: Tümünü seç


Stok_Kod > 100 ve Stok_Kod < 500 and

Cari_Kod > 10 ve Cari_Kod < 1000 and

Arac_Kod > 1 ve Arac_Kod < 50  

Nasıl bir SQL cümlesi kullanmalıyız :?:

şimdiden herkese teşekkür ederim.

iyi günler...
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Mesaj gönderen aslangeri »

s.a.
bir stored procedure hazırlayıp (iç içe for döngüleri kullanan) onu select ile table gibi kullanarak yapabilirsiniz.
şöyleki

Kod: Tümünü seç

create procedure stokhareketsec(
ilkstokkod,sonstokkod,ilkcarikod,soncarikod,ilkarackod,sonarackod integer)
gibi bir storedprocedure tanımlayacaksın.
select işlemini sp nin nimetlerinden faydalanarak yapacaksın.
tavsiyem bütün sorguyu tek seferde değilde adım adım yapman.
önce stok koduna göre yap sonra carikoduna göre vs...

daha sonra sql in şu şekilde olacak.

Kod: Tümünü seç

select * from stokhareketsec(100,500,10,1000,1,50)
kolay gelsin.
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
Kullanıcı avatarı
gkimirti
Admin
Mesajlar: 1956
Kayıt: 02 Eyl 2003 04:44
Konum: İstanbul

Mesaj gönderen gkimirti »

Kod: Tümünü seç

select * from stokhareket sh
inner join carikart c on c.cari_id=sh.cari_id
inner join stokkart s on s.stok_id=sh.stok_id
inner join carikodtanim ct on ct.arac_id=sh.arac_id
bu sekilde join olusturup

Kod: Tümünü seç

where (s.Stok_Kod beetwen 100 and 500) and
           (c.Cari_Kod beetwen 10 and 1000) and
           (ct.Arac_Kod beetwen 1 and Arac_Kod)
seklinde bir where cumlesi kullanabilirsin
burada dikkat edecegin bir nokta
eger join yaptıgın tablolarda stokharekette id si gecen kayıt yok ise sorgu icerisine dahil edilmez (inner join) eger bunu da dahil etmek istersen
inner join yerine left outer join kullanmalısın
ÜŞENME,ERTELEME,VAZGEÇME
Uğur1982
Üye
Mesajlar: 383
Kayıt: 11 Mar 2005 03:18
Konum: İzmir

Mesaj gönderen Uğur1982 »

@aslangeri,@gkimirti hocam teşekkür ederim,çalıştı. :wink:

iyi günler...
Uğur1982
Üye
Mesajlar: 383
Kayıt: 11 Mar 2005 03:18
Konum: İzmir

Mesaj gönderen Uğur1982 »

merhaba;

Aynı yere yazıyorum, bi nevi devamı niteliğinde olduğu için; Bu sefer aynı tablonun UPDATE 'inde takıldım :roll:
aynı sorgulama şartları girilerek;

Kod: Tümünü seç


Stok_Kod > 100 ve Stok_Kod < 500 and

Cari_Kod > 10 ve Cari_Kod < 1000 and

Arac_Kod > 1 ve Arac_Kod < 50  

'Tutar' alanını Update etmek istiyorum.İnner Join leri kabul etmiyor.Çoğunluk listelemelerde kullanıldığı için.Farklı şekillerde denedim ama yine çuvalladım :) .Nasıl bir SQL cümlesi yazmam gerekir :?: .Teşekkür ederim.iyi akşamlar....


Tablo isimleri:

:arrow: STOKHAREKET======== :arrow: CARIKART

* Stokhareket_ID=========* Cari_ID
* Cari_ID===============* Cari_Kod
* Stok_ID
* Arac_ID
* Tutar (Double Precision)

:arrow: STOKKART=========== :arrow: CARIKODTANIM

* Stok_ID================= * Arac_ID
* Stok_Kod ================ *Arac_Kod
* Stok_Adi================= *Arac_Adi

:arrow: * _ID' lerin hepsi = Integer
:arrow: *_Adi,*_Kod = Varchar 20
:arrow: vt = FireBird 1.5
Kullanıcı avatarı
gkimirti
Admin
Mesajlar: 1956
Kayıt: 02 Eyl 2003 04:44
Konum: İstanbul

Mesaj gönderen gkimirti »

olayın mantıgı su sekilde :

Kod: Tümünü seç

update stokhareket sh set
sh.tutar=--yeni degeri ne ise
where 
sh.stok_id in (select stok_id from stokkart where Stok_Kod beetwen 100 and 500)
and
sh.cari_id in (select cari_id from carikart where Cari_Kod beetwen 10 and 1000)
and
sh.arac_id in (select arac_id from carikodtanim where Arac_Kod beetwen 1 and 50)
ÜŞENME,ERTELEME,VAZGEÇME
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Mesaj gönderen aslangeri »

s.a.
eğer tek kayıt update edeceksen
update etmek istediğin tutar alanı hangi tablodaysa onun pkeyinden faydalanarak yapabilirsin.
eğer toplu bir update yapacaksan @gkimirti hocam olayın mantığını yazmış.
kolay gelsin.
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
Uğur1982
Üye
Mesajlar: 383
Kayıt: 11 Mar 2005 03:18
Konum: İzmir

Mesaj gönderen Uğur1982 »

merhaba;
@gkimirti,@aslangeri hocam,Allah Razı olsun.Tek kelimeyle Süpersiniz ...çalıştı. :wink:

iyi günler...
Uğur1982
Üye
Mesajlar: 383
Kayıt: 11 Mar 2005 03:18
Konum: İzmir

Mesaj gönderen Uğur1982 »

merhaba;

Arkadaşlar tablonun yapısını değiştirdim.Aşağıdaki şekillerde kullandım.Farklı bir mantıkta takıldım.:roll:

Tablo isimleri:

:arrow: STOKHAREKET======== :arrow: CARIKART

* Stokhareket_ID==========* Cari_ID
* Cari_ID===============* Cari_Kod
* Stok_ID===============*KOD1_ID
=====================*KOD2_ID
=====================*KOD3_ID

:arrow: STOKKART=========== :arrow: CARIKODTANIM

* Stok_ID================= * KODLAR_ID
* Stok_Kod ================ *KOD_ADI
* Stok_Adi================= *KOD_ACIKLAMA
======================== *FIELD_ADI
:arrow: * _ID' lerin hepsi = Integer
:arrow: *_Adi,*_Kod = Varchar 20
:arrow: vt = FireBird 1.5

Yukarıdaki CARIKART tablosundaki
*KOD1_ID==
*KOD2_ID====KODLAR_ID
*KOD3_ID==
Bu alanlar CARIKODTANIM tablosundaki KODLAR_ID göre uygun kodların karşılığı,yani bu 3 kod burada aynı alanda tutuluyor.Bu 3 kodu birbirinden ayıran tek kontrol FIELD_ADI;
örnek olarak KOD1_ID ye kayıt girildiği zaman FIELD_ADI='KOD1' gibi.
,diğer kontrollerini SP ile yaptırıyorum.Buraya kadar herşey tamam.Tek sorunum yukarıdaki 3 alanın KODLAR_ID alanına nasıl bağlanacağı..

Kod: Tümünü seç

Stok_Kod > 100 ve Stok_Kod < 500 and

Cari_Kod > 10 ve Cari_Kod < 1000 and

KOD_ADI  > 1 ve KOD_ADI  < 50  and FIELD_ADI='KOD1' AND  //carikarttaki KOD1 alanı
KOD_ADI  > 5 ve KOD_ADI  < 20  and FIELD_ADI='KOD2' AND  //carikarttaki KOD2 alanı
KOD_ADI  > 30 ve KOD_ADI  < 40  and FIELD_ADI='KOD3' AND  //carikarttaki KOD3 alanı

Yukarıdaki gibi bir sorguyu nasıl yapabilirim.Aynı şekilde :arrow: STOKHAREKET 'i sorguluyorum.

teşekkür ederim..
Uğur1982
Üye
Mesajlar: 383
Kayıt: 11 Mar 2005 03:18
Konum: İzmir

Mesaj gönderen Uğur1982 »

Arkadaşlar sorunumu çözdüm.Belki birilerinin işine yarar;:wink:

Kod: Tümünü seç

select * from STOKHAREKET SH
inner join STOKKART S on S.STOK_ID=SH.STOK_ID
inner join CARIKART C on C.CARI_ID=SH.CARI_ID
  and
    CARIKART.KOD1_ID in (select KODLAR_ID from CARIKODTANIM where KOD_ADI  between 1 and 50)
  and
    CARIKART.KOD2_ID_id in (select KODLAR_ID from CARIKODTANIM where KOD_ADI between 5 and 20)
  and 
    CARIKART.KOD3_ID in (select KODLAR_ID from CARIKODTANIM where KOD_ADI between 30 and 40)

where (S.STOK_KOD beetwen 100 and 500)
  and
      (C.CARI_KOD beetwen 10 and 1000) 
iyi günler....
Cevapla