merhaba arkadaslar
fb d7
bir turlu isin icinden cıkamadım
query ile
soyle bir sorunum var
iki tablom var biri ana tablo diger detay tablo
detay tablodan parca miktarlarını toplayarak ana tabloda gosterecek
master detay iliskisi var alanlar soyle
anatablo detaytablo
id parcaadi toplammiktar detayid anatabloid gelenparcamiktari
gelen parca miktarlarini toplayarak ana tabloda gosterecek.su kadarini yaptim fakat dogru degil cunku eger detay tabloya kayıt yapılmamıssa ana tabloda toplammiktari gostermeyecektir ben toplam miktari 0 olarak gostermek istiyorum eger detaytabloya kayıt yapılmamıssa kullandıgım kod soyle editleri gridden tıklama ile idleri aldiriyorum
('select anatablo.ID as KAYIT_NO,anatablo1.RESIMNO AS RESIM_NO,COALESCE(sum(detailtablo1.gelenadet),0) as TOPLAM_GELEN,COALESCE(anatablo1.mussipadeti-sum(detaytablo1.gelenadet),anatablo1.mussipadeti) as TOPLAM_KALAN');
(',anatablo1.aciklama from anatablo1,DETAILtablo1 where anatablo1.ID='''+EDIT2.text+''' and DETAILtablo1.anatabloID=anatablo1.id group by anatablo1.ID,ANATABLO1.RESIMNO,anatablo1.mussipadeti,anatablo1.aciklama') ;
bu sorguda eger detaytablo da anatabloid sini bulamazsa ana tabloda o kaydı gostermeyecektir ama ben 0 olarak gostermesini istiyorum eger sartta bu ifadeyi kaldirirsam anatablo1.ID='''+EDIT2.text+''' o zamanda yanlis sonuc verecektir.
left joinle cozmeye calistim ama isin icinden cikamadim acaba union mu kullanmaliyim fikri olan varmi arkadaslar ?
ve arkadaslar join yapisi ile tekrar ayri bir sart eklenebilirmi yani join sarti and ... diyerek yeni bir sart eklenebilirmi?
tskler.
sorgu
Re: sorgu
peki arkadaslar 3 tablom var
hepsi birbiri iste masterdetail bagli
table1 table2 table3
------ ------- -------
id table1id table2id
urnad sipadet id
id geladet
yapmak istedigim su
table1 den kaydı alacak table2 deki sipadet ten table3 teki gelenadetleri toplayarak cıkaracak.
select table1.urnad ,table2.sipadet-sum(table3.geladet) from table1 left outer join table2 on table1.id=table2.table1id and table2.id=table3.table2id
boyle bir sorguda sanirim bana dogru sonucu vermeyecektir cunku table2 de kayıt olabilir ama table3 te olmayabilir o zaman
table2.id=table3.table2id dolayı bana dogru sonucu vermeyecektir.
cozum onerisi olan varmi?
tskler
hepsi birbiri iste masterdetail bagli
table1 table2 table3
------ ------- -------
id table1id table2id
urnad sipadet id
id geladet
yapmak istedigim su
table1 den kaydı alacak table2 deki sipadet ten table3 teki gelenadetleri toplayarak cıkaracak.
select table1.urnad ,table2.sipadet-sum(table3.geladet) from table1 left outer join table2 on table1.id=table2.table1id and table2.id=table3.table2id
boyle bir sorguda sanirim bana dogru sonucu vermeyecektir cunku table2 de kayıt olabilir ama table3 te olmayabilir o zaman
table2.id=table3.table2id dolayı bana dogru sonucu vermeyecektir.
cozum onerisi olan varmi?
tskler
Garibanus
Re: sorgu
Sorunun cevabını bir örnekle açıklamak istiyorum.
Tam olarak uymayabilir.
Söyle düşünelim Bir müşteriye 2 adet fatura kestin artık fatura tablonda 2 adet A ve B numaralı 2 faturan var.
A faturasını tahsil ettin.
B faturası tahsil edilmedi.
Ve tablonda yapında şu.
Faturatbl
Tahsilattbl
şimdi bunu inner joinle bağlarsak en az bir tahsilat hareketi görmüş faturalar gelecek sadece.
Peki ben sende tüm faturalarımı görmek istiyorum tahsil olmuş ya da olmamış dersem.
left join ile bağlayacaksın. LEFT joinin anlamı from dan sonra gelen tablonun join işleminin şartı sağlanmıyorsa o kaydın karşına null kayıt gelir.
Yani lef ile bağlarsam.
Faturano Tutar Tahsilat
A 5 5
B 10 null
gibi bunun tam tersi ise right joindir.
bu ikiside eğer sağlamıyorsa şartları full join dediğimiz join ile iki tablodaki tüm kayıtları getirebilirsin.
Yani işin özü tablo yapısın durumuna göre.
Son olarak
aslında aşağıdakıdaki durumda 3. tablonada left diyebilirsin yukarıda yazdığım örneğe de uyuyor yani inner join haricindeki tüm joinlerde on dan sonraki şarta bakmaz.
dolayısıyla
select
*
from tbladın
left tbladınz on tbladın.id=tbladınz.tbladın_id
left tblasdsdasd on tblasdsdasd.tbladın_id= tbladın.id
şeklinde yazarsan geldiğini göreceksin
iyi günler.
Tam olarak uymayabilir.
Söyle düşünelim Bir müşteriye 2 adet fatura kestin artık fatura tablonda 2 adet A ve B numaralı 2 faturan var.
A faturasını tahsil ettin.
B faturası tahsil edilmedi.
Ve tablonda yapında şu.
Faturatbl
Tahsilattbl
şimdi bunu inner joinle bağlarsak en az bir tahsilat hareketi görmüş faturalar gelecek sadece.
Peki ben sende tüm faturalarımı görmek istiyorum tahsil olmuş ya da olmamış dersem.
left join ile bağlayacaksın. LEFT joinin anlamı from dan sonra gelen tablonun join işleminin şartı sağlanmıyorsa o kaydın karşına null kayıt gelir.
Yani lef ile bağlarsam.
Faturano Tutar Tahsilat
A 5 5
B 10 null
gibi bunun tam tersi ise right joindir.
bu ikiside eğer sağlamıyorsa şartları full join dediğimiz join ile iki tablodaki tüm kayıtları getirebilirsin.
Yani işin özü tablo yapısın durumuna göre.
Son olarak
aslında aşağıdakıdaki durumda 3. tablonada left diyebilirsin yukarıda yazdığım örneğe de uyuyor yani inner join haricindeki tüm joinlerde on dan sonraki şarta bakmaz.
dolayısıyla
select
*
from tbladın
left tbladınz on tbladın.id=tbladınz.tbladın_id
left tblasdsdasd on tblasdsdasd.tbladın_id= tbladın.id
şeklinde yazarsan geldiğini göreceksin
iyi günler.
derviş
Re: sorgu
tskler unalaydin
peki
table1 ve table2 birebir masterdetail table2 de table1id den 1 tane var
table2 ile table3 birebir masterdetail detail
yani table3 de birden fazla table2id olabilir bu durumda bi degisiklik olurmu?
tskler
peki
table1 ve table2 birebir masterdetail table2 de table1id den 1 tane var
table2 ile table3 birebir masterdetail detail
yani table3 de birden fazla table2id olabilir bu durumda bi degisiklik olurmu?
tskler
Garibanus