sorgu

MS SQL Server veritabanı ve SQL komutlarıyla ilgli sorularınızı sorabilirsiniz. Delphi tarafındaki sorularınızı lütfen Programlama forumunda sorunuz.
Cevapla
Vital
Üye
Mesajlar: 280
Kayıt: 01 Oca 2008 08:50

sorgu

Mesaj gönderen Vital »

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.
Garibanus
Vital
Üye
Mesajlar: 280
Kayıt: 01 Oca 2008 08:50

Re: sorgu

Mesaj gönderen Vital »

arkadaslar cozumu buldum tskler

from anatablo1 left join detailtablo1 on anatablo1.anatabloid=detailtablo1.anatabloid where anatablo1.GENDETAILID='''+ edit2.Text+'''

tskler
Garibanus
Vital
Üye
Mesajlar: 280
Kayıt: 01 Oca 2008 08:50

Re: sorgu

Mesaj gönderen Vital »

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
Garibanus
unalaygun
Üye
Mesajlar: 139
Kayıt: 27 Mar 2004 12:34
Konum: istanbul

Re: sorgu

Mesaj gönderen unalaygun »

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.
derviş
Vital
Üye
Mesajlar: 280
Kayıt: 01 Oca 2008 08:50

Re: sorgu

Mesaj gönderen Vital »

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
Garibanus
unalaygun
Üye
Mesajlar: 139
Kayıt: 27 Mar 2004 12:34
Konum: istanbul

Re: sorgu

Mesaj gönderen unalaygun »

öncelikle unalaygun
kardeşim hemen deneyip görebilirsin dene bakalım oluyormu olması lazım.
derviş
Vital
Üye
Mesajlar: 280
Kayıt: 01 Oca 2008 08:50

Re: sorgu

Mesaj gönderen Vital »

kusura bakma unalaygun

evet istedigimiz sonucu veriyor bu kod tskler.
Garibanus
unalaygun
Üye
Mesajlar: 139
Kayıt: 27 Mar 2004 12:34
Konum: istanbul

Re: sorgu

Mesaj gönderen unalaygun »

Rica ederim kardeşim bu forumun amacı bu birbirimiz ile birikimlerimizi paylaşma.
bu forumu çok seviyorum çok seviyeli bir forum birbirimizden öğrenecek çok şeyimiz var.
İyi çalışmalar.
derviş
Cevapla