Beni Bu JOIN komutları mahvetti

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
ikut

Beni Bu JOIN komutları mahvetti

Mesaj gönderen ikut »

Merhaba

Kod: Tümünü seç

SELECT   BOR.C13SIRKOD, BOR.C13ODEYIL, BOR.C13ODESNO, BOR.C13CALKOD, 
         BOR.C13KESTOP, BOR.C13NETMAAS, PER.B79SABKAZ1, PER1.Z5CALADI, 
         PER1.Z5CALSOY, PER1.Z5DEPKOD, PER1.Z5GRVKOD1 
FROM     VPERLIB.BORDROF BOR, 
         VPERLIB.PERBRDF PER, 
         VPERLIBP.PERMASF PER1 
WHERE    BOR.C13CALKOD=PER.B79CALKOD 
AND      BOR.C13CALKOD=PER1.Z5CALKOD 
AND      (BOR.C13CALKOD = '03311' 
OR       BOR.C13CALKOD = '03312') 
AND      BOR.C13ODEYIL = 2006
Şimdi bu sql de nedendir bilinmez ilginç şeyler oluyor. Huyuna suya tam alışamadım galiba. Örneğin Kolonlar bu sırada iken herşey doğru ama sırayı değiştirip z5grvkod1 başa alınca birden geri dönen satır sayısı artıyor.

Ben ne yapmak istediğimi yazayım ona göre öneriniz varsa tartışalım.

A tablosu

sicilleri ve isim soy isim ile görev kodlarını tutuyor.

B tablosu

Sicil bazında aylara göre ödemeleri tutuyor.

C Tablosu

sicil bazında ek ödemelerin tutulduğu bir tablo

D tablosu ise

Görev kodlarının ve açıklamalarının tutulduğu bir yer

Şimdi yapmak istediğimiz şu;

Ayrılan personellerden kafadan kurtulmak için masterfile ı bordro olarak alıyoruz (B tablosu) sonra burdan ilgili ayın kaydına bakarak net maaş ve kesinti kolonlarını çekiyoruz. C tablosundan adamın ek ödemesini çekiyoruz. İstediğimiz aylık olarak departman bazında maaş maliyeti. örneğin 50 görev bilgi işlemin kodu. 50 kodlu personellerin aylık maliyeti gibi.

Şimdi yukardaki kod bunu yapıyor. Ama group by deyince çakılıp kalıyor. İşin tuhafı Tablo Adan işe başlarsam işten çıkmış personeller hala duruyor.

İşin en kötü yanı görev kodlarının açıklamalrınada alayım deyince başlıyor. Yukarda ABCD tablolarının hepsinde Personel Sİcil no KEY ve bu açıdan sorun yok. Ama D tablosunuda göreev kodu üzerinde join edeyim dediğim zaman her kayıt 30 40 kere geliyor. kısaca kartezyen çarpım oluyor.

Ne yapacam şaştım. Bu join vs güzelce anlatan bir kaynak yokmu ya. Query builder ile yapıyorum genede değişmiyor sonuç..

Saygılar
ikut

düşününce

Mesaj gönderen ikut »

bu ilk sorguyu başka bir table içine insert into ile kaydetsem sonra bunları görev kodu tablosu ile join etsem sorun olmaz galiba.

yada görev kodu açıklamasını boşversem tablo tek tablo olacağından group ve order bye yapmakta bir sorunum kalmaz değilmi.

ya yicem kafayın nebu böyle ya

İyi çalışmalar
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Mesaj gönderen rsimsek »

İstersen sorguyu JOIN lemede önce esas tabloya gerekli kısıtları uygulayıp, ondan sonra diğer iki tabloyu JOIN lemelisin :idea:

Kod: Tümünü seç

SELECT BOR.C13SIRKOD, BOR.C13ODEYIL, BOR.C13ODESNO, BOR.C13CALKOD,
       BOR.C13KESTOP, BOR.C13NETMAAS, PER.B79SABKAZ1, PER1.Z5CALADI,
       PER1.Z5CALSOY, PER1.Z5DEPKOD, PER1.Z5GRVKOD1
FROM   VPERLIB.BORDROF BOR,
       VPERLIB.PERBRDF PER,
       VPERLIBP.PERMASF PER1
WHERE (BOR.C13CALKOD = '03311' OR BOR.C13CALKOD = '03312')
  AND BOR.C13ODEYIL = 2006
  AND PER.B79CALKOD = BOR.C13CALKOD
  AND PER1.Z5CALKOD = BOR.C13CALKOD
Aslında burada perfomans artışından daha fazlası beklenmemeli fakat alanın sırasının değişmesi de bu şartlarda sonucu değiştirmemeli :!:
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
ikut

Merhaba

Mesaj gönderen ikut »

Server as/400 olunca bazı şeyler farklı çalışıyor. Mesela bugun IBM in ole db surucusunde bug buldum. daha doğrusu ne oluyor derken nette bug a denk geldim. tuhaf oluyor bazı şeyler...
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Mesaj gönderen rsimsek »

Yine de diğer tabloları bağlamadan esas tablodaki kıstasları/koşulları uygulamak gerekir :idea:
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
ikut

Merhaba

Mesaj gönderen ikut »

rsimsek yazdı:Yine de diğer tabloları bağlamadan esas tablodaki kıstasları/koşulları uygulamak gerekir :idea:
Üstadım bu konuda biraz detaylı yazmanız mümkünmü... Açık konuşmak gerekirse benim bilmediğimi bilen ve anlatan herkesi dinler birşeyler öğrenmeye çalışırım. bu bağlamda mesela şu olursa şudur diye 3 beş basit sorgu yazmanız mümkünmü. mesela benim aklıma sonradan içiçe select yazmak geldi ama nasıl yapacağımı bilemedim.

Ben bu tip şeyleri kendi arşivimede koyuyorum. eğer biraz detaylı ve örnekli yazarsanız emin olun bir sürü arkadaş yararlanır. Makalelerde ve internette sadece basit örnekler veriliyor. ondan sonrada böyle çakılıp kalıyoruz ..

Saygılar
Kullanıcı avatarı
tuanna
Üye
Mesajlar: 582
Kayıt: 06 Ara 2004 05:01
Konum: Ankara
İletişim:

Re: Beni Bu JOIN komutları mahvetti

Mesaj gönderen tuanna »

ikut yazdı:Merhaba

Kod: Tümünü seç

SELECT   BOR.C13SIRKOD, BOR.C13ODEYIL, BOR.C13ODESNO, BOR.C13CALKOD, 
         BOR.C13KESTOP, BOR.C13NETMAAS, PER.B79SABKAZ1, PER1.Z5CALADI, 
         PER1.Z5CALSOY, PER1.Z5DEPKOD, PER1.Z5GRVKOD1 
FROM     VPERLIB.BORDROF BOR, 
         VPERLIB.PERBRDF PER, 
         VPERLIBP.PERMASF PER1 
WHERE    BOR.C13CALKOD=PER.B79CALKOD 
AND      BOR.C13CALKOD=PER1.Z5CALKOD 
AND      (BOR.C13CALKOD = '03311' 
OR       BOR.C13CALKOD = '03312') 
AND      BOR.C13ODEYIL = 2006
Şimdi bu sql de nedendir bilinmez ilginç şeyler oluyor. Huyuna suya tam alışamadım galiba. Örneğin Kolonlar bu sırada iken herşey doğru ama sırayı değiştirip z5grvkod1 başa alınca birden geri dönen satır sayısı artıyor.

Ben ne yapmak istediğimi yazayım ona göre öneriniz varsa tartışalım.

A tablosu

sicilleri ve isim soy isim ile görev kodlarını tutuyor.

B tablosu

Sicil bazında aylara göre ödemeleri tutuyor.

C Tablosu

sicil bazında ek ödemelerin tutulduğu bir tablo

D tablosu ise

Görev kodlarının ve açıklamalarının tutulduğu bir yer

Şimdi yapmak istediğimiz şu;

Ayrılan personellerden kafadan kurtulmak için masterfile ı bordro olarak alıyoruz (B tablosu) sonra burdan ilgili ayın kaydına bakarak net maaş ve kesinti kolonlarını çekiyoruz. C tablosundan adamın ek ödemesini çekiyoruz. İstediğimiz aylık olarak departman bazında maaş maliyeti. örneğin 50 görev bilgi işlemin kodu. 50 kodlu personellerin aylık maliyeti gibi.

Şimdi yukardaki kod bunu yapıyor. Ama group by deyince çakılıp kalıyor. İşin tuhafı Tablo Adan işe başlarsam işten çıkmış personeller hala duruyor.

İşin en kötü yanı görev kodlarının açıklamalrınada alayım deyince başlıyor. Yukarda ABCD tablolarının hepsinde Personel Sİcil no KEY ve bu açıdan sorun yok. Ama D tablosunuda göreev kodu üzerinde join edeyim dediğim zaman her kayıt 30 40 kere geliyor. kısaca kartezyen çarpım oluyor.

Ne yapacam şaştım. Bu join vs güzelce anlatan bir kaynak yokmu ya. Query builder ile yapıyorum genede değişmiyor sonuç..

Saygılar

bence bu sanki islem onceligi (Matematikte) Sql de snaırım bu sorgu onceligi Once siz söle düşunun bence her sartınıza uygun kayıtları viewler yapın sonra joın islemi yapın join yaparkende biliyorsunuz joın islemlemleride benim bildiğğim ğç fark lı yontem var...

left join
right Join
inner join

bunları yapıp veya bunlardananlamadığınızı sorarsanız daaha iyi olur

kolay gelsin
Siz hayal edin...Biz yapalım TuannaSoft...
ikut

Merhaba

Mesaj gönderen ikut »

Merak etmeyin üçüylede ayrı ayrı denedim. ama çözdüğüm kadarıyla tabloların yazılış sırası yada alanların sırası filanda etkiliyor gibi. Yoksa Left outer ilede denedim right outer ilede ve full outer ilede. Sadece LEFt ile uygun sonuçlar alınıyor. ama onda görev kodunu alamıyor.

Bu konuda bir kaynak olsada aydınlansak. webde 100 tane siteye girdim hepsi temem joini anlatıyor ya
Kullanıcı avatarı
tuanna
Üye
Mesajlar: 582
Kayıt: 06 Ara 2004 05:01
Konum: Ankara
İletişim:

Mesaj gönderen tuanna »

sölediğim anlasılmamıs sanırım ...

sölekine

a tablosundan istediğim alanları sorgula
b tablosunda da istediğin alanalrı sorgula
c tablosundada istediğin alanlalrı sorgula
d de aynı ısey

şimdi sorgular çekildiğine göre bu sorguları joinlemeye geldi...

işte bu aşamada iyi bir mantık yapmak lazm
bu senin istediğine göre sonuc almana göre adımlamak lazım buna sen karar vereceksin

left jon su demek birinci tablodaki tum alanlar ikinci tablodaki eşleşen alanlar

rifgt join ise ikinci tablodaki tüm alanalrı birinci talodaki eslesen kayıtlar

inner join ise her iji tablodan sadece eşlesen kaıtlar demek bu bağlamda sıkıntınız nerede onu ornek kodla yazarsanız ....
Siz hayal edin...Biz yapalım TuannaSoft...
ikut

merhaba

Mesaj gönderen ikut »

tuanna yazdı:sölediğim anlasılmamıs sanırım ...

sölekine

a tablosundan istediğim alanları sorgula
b tablosunda da istediğin alanalrı sorgula
c tablosundada istediğin alanlalrı sorgula
d de aynı ısey

şimdi sorgular çekildiğine göre bu sorguları joinlemeye geldi...

işte bu aşamada iyi bir mantık yapmak lazm
bu senin istediğine göre sonuc almana göre adımlamak lazım buna sen karar vereceksin

left jon su demek birinci tablodaki tum alanlar ikinci tablodaki eşleşen alanlar

rifgt join ise ikinci tablodaki tüm alanalrı birinci talodaki eslesen kayıtlar

inner join ise her iji tablodan sadece eşlesen kaıtlar demek bu bağlamda sıkıntınız nerede onu ornek kodla yazarsanız ....
Hocam teori olarak söylediklerinizi anlıyorum ama maalesef pratikte uygulama sıkıntımız rica etsem somut bir örnek yada üb beş satır kod yokmudur.

Saygılar
Kullanıcı avatarı
tuanna
Üye
Mesajlar: 582
Kayıt: 06 Ara 2004 05:01
Konum: Ankara
İletişim:

Mesaj gönderen tuanna »

ama teori bu ise adım adım yaparsak olması lazım
Siz hayal edin...Biz yapalım TuannaSoft...
Cevapla