Inner Join içinde Update kullanımı

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
SAHAN33
Üye
Mesajlar: 36
Kayıt: 24 Eki 2006 04:34

Inner Join içinde Update kullanımı

Mesaj gönderen SAHAN33 »

İyi günler diliyorum herkese
Firebird 1.5 te 4 farklı tablodan veri almam gerekiyor. Tablolar

Tablo1 için
ID,Tarih,Ulke_ID, Musteri_ID (ID alanı key)
1,01.01.2008,18,24
2,03.01.2008,10,56
.
.
.
Tablo 2 için
ID,KAYIT_NO,URUN_ADI (KAYIT_NO Alanı tablo1 deki ID ile bağlı. tablo2, Tablo1 için detay tablosu)
1,1,portakal
2,1,mandalina
3,2,limon
.
.
.
.
.
Tablo3 için (Ulkelerin tutulduğu tablo)
ID,ULKE_ADI
1,Turkiye
2,İngiltere
3,Yunanistan
4,Bulgaristan
.
.
.
.
.
Tablo4 İçin Müşterilerin Tutulduğu Tablo
ID,AD_SOYAD
1,Ali Veli
2,Veli Ali
3,Mustafa
4,Mehmet
.
.
.
.

tablo yapıları böyle. İki tarih aralığı girildiğinde Tablo1 den iki tarih aralığında olan uygun kayıtlar gelecek bunu

Kod: Tümünü seç

SELECT
 TABLO1.TARIH,
 TABLO1.ULKE_ID,
 TABLO1.MUSTERI_ID,
 TABLO2.KAYIT_NO,
 TABLO2.URUN_ADI,
FROM TABLO1
INNER JOIN TABLO2 ON TABLO1.ID = TABLO2.KAYIT_NO
WHERE
TABLO1.TARIH >='01.01.2008'
AND TABLO1.TARIH <= '31.01.2008'
 
Koduyla alabiliyorum Ama Tablo1 den ULKE_ID ve MUSTERI_ID alanları ID nolarıyla geliyor. Banim amacım bu alanların Tablo3 ve Tablo4 ten karşılıklarını alarak Çıktısı
1,01.01.2008,Türkiye,Ahmet Mahmet
2,05.01.2008,Yunanistan,Mahmet Ahmet
gibi olmasını sağlamak. Sorum da Bu Sql sorgusuna sorgulama zamanında Update nasıl çekebilirim ?
Umarım sorunumu anlatabilmişimdir.[/code]
Kullanıcı avatarı
sadettinpolat
Moderator
Mesajlar: 2131
Kayıt: 07 Ara 2003 02:51
Konum: Ankara
İletişim:

Mesaj gönderen sadettinpolat »

table 3 ve 4 u de join ile cekip gerekli eslestirmeleri yaptiktan sonra select ifadesinde table3.musteriadi,table4.ulkeadi seklinde listeletmen lazim.


SELECT
TABLO1.TARIH,
TABLO3.ULKE_ADI,
TABLO4.MUSTERI_ADI,
TABLO2.KAYIT_NO,
TABLO2.URUN_ADI,
FROM TABLO1
INNER JOIN TABLO2 ON TABLO1.ID = TABLO2.KAYIT_NO
INNER JOIN TABLO1 ON TABLO1.ULKE_ID = TABLO3.ULKE_ID
INNER JOIN TABLO1 ON TABLO1.MUSTERI_ID = TABLO4.MUSTERI_ID

TABLO1.TARIH >='01.01.2008'
AND TABLO1.TARIH <= '31.01.2008'

update cekme kismini ise anlamadim.
"Sevmek, ne zaman vazgececegini bilmektir." dedi, bana.

---
http://sadettinpolat.blogspot.com/
SAHAN33
Üye
Mesajlar: 36
Kayıt: 24 Eki 2006 04:34

Mesaj gönderen SAHAN33 »

nasıl teşekkür etsem bilmiyorum. Çok çok çok teşekkür ederim. O kadar büyük döngülerden ve yavaşlıktan kurtardın kii. Tekrar tşk ederim..
Kolay gelsin...
SAHAN33
Üye
Mesajlar: 36
Kayıt: 24 Eki 2006 04:34

Mesaj gönderen SAHAN33 »

özür dileyerek aynı durum için oluşan başka bir sorunu belirtmek istiyorum.
Diyelim ki Tablo1 in asıl yapısı söyle olsun (ki zaten öyle)
Tablo1 için
ID,TARIH,ULKE_ID, MUSTERI_ID,YETKILI_ID (ID alanı key)
1,01.01.2008,18,24,2
2,03.01.2008,10,56,1
.
.
.
.
ve

Tablo 4 ün de Yapısı söyle olsun
Tablo4 İçin (Müşterilerin Tutulduğu Tablo)
ID,FIRMA_ADI,YETKILISI
1,birinci firma,Ali Veli
2,ikinci firma,Veli Ali
3,ikinci firma,Mustafa
4,üçüncü firma,Mehmet
5,dördüncü firma, mustafa
6,dördüncü firma,ahmet
.
.
.
.
bunu sorgusunu dediğiniz yöntemle çekince

Kod: Tümünü seç

SELECT 
TABLO1.TARIH, 
TABLO3.ULKE_ADI, 
TABLO4.MUSTERI_ADI, 
TABLO4.YETKILI_ADI,
TABLO2.KAYIT_NO, 
TABLO2.URUN_ADI, 
FROM TABLO1 
INNER JOIN TABLO2 ON TABLO1.ID = TABLO2.KAYIT_NO 
INNER JOIN TABLO1 ON TABLO1.ULKE_ID = TABLO3.ULKE_ID 
INNER JOIN TABLO1 ON TABLO1.MUSTERI_ID = TABLO4.MUSTERI_ID
INNER JOIN TABLO1 ON TABLO1.YETKILI_ID = TABLO4.YETKILI_ID  

TABLO1.TARIH >='01.01.2008' 
AND TABLO1.TARIH <= '31.01.2008'
çıkan sonuç

1,01.01.2008,Türkiye,Ahmet Mehmet,Ahmet Mehmet
2,05.01.2008,Yunanistan,Mehmet Ahmet,Mehmet Ahmet

Yani MUSTERI_ID ve YETKILI_ID alanları için Tablo4 ten gelen veri aynı çıkıyor. YETKILI_ID alanı en son sorguya INNER JOIN le eklendiği için ve aynı MUSTERI_ID alanıyla aynı tabloda olduğu için her ikisini birbirinden ayırmıyor. Sizce buna nasıl bir çözüm getirebilirim ?
Kullanıcı avatarı
sadettinpolat
Moderator
Mesajlar: 2131
Kayıt: 07 Ara 2003 02:51
Konum: Ankara
İletişim:

Mesaj gönderen sadettinpolat »

SAHAN33 yazdı: YETKILI_ID alanı en son sorguya INNER JOIN le eklendiği için ve aynı MUSTERI_ID alanıyla aynı tabloda olduğu için her ikisini birbirinden ayırmıyor. Sizce buna nasıl bir çözüm getirebilirim ?
ayirmiyor gibi bir ifade yanlis bir ifade gibi. cunku siz select kisminda hangi alanlari belirtmis iseniz veritabani o alanlari size gosterir.sorgu cumlenizi ve verilerinizi kontrol edin, gozden kacan ufak bir nokta olabilir.
"Sevmek, ne zaman vazgececegini bilmektir." dedi, bana.

---
http://sadettinpolat.blogspot.com/
SAHAN33
Üye
Mesajlar: 36
Kayıt: 24 Eki 2006 04:34

Mesaj gönderen SAHAN33 »

Hocam iyi akşamlar. Dün konuştuklarımızdan sonra aynı tabloları içeren küçük bir database oluşturdum. 4 tablosu var. Aynı sorguyu veriyorum. hiç kayıt döndürmiyor. database i nete atıyorum. Sql Sorgusunu da aktarıyorum. Lüften bir bakar mısınız ?. Yanlış nerede ?

Dosya : http://rapidshare.de/files/38551799/DENEME.zip.html
Sql Sorgusu

Kod: Tümünü seç

SELECT
TBL_TABLO1.TARIH,
TBL_TABLO3.ULKE_ADI,
TBL_TABLO4.FIRMA_ADI,
TBL_TABLO4.YETKILI,
TBL_TABLO2.URUN_ADI
FROM TBL_TABLO1
INNER JOIN TBL_TABLO2 ON TBL_TABLO1.ID = TBL_TABLO2.KAYIT_NO
INNER JOIN TBL_TABLO3 ON TBL_TABLO1.ULKE_ID = TBL_TABLO3.ULKE_ADI
INNER JOIN TBL_TABLO4 ON TBL_TABLO1.MUSTERI_ID = TBL_TABLO4.FIRMA_ADI
INNER JOIN TBL_TABLO4 ON TBL_TABLO1.YETKILI_ID = TBL_TABLO4.YETKILI
WHERE
TBL_TABLO1.TARIH >=:TARIH1
AND
TBL_TABLO1.TARIH <=:TARIH2
Yardımlarınız için Teşekkür etmeyi de unutmayayım..
Kullanıcı avatarı
sadettinpolat
Moderator
Mesajlar: 2131
Kayıt: 07 Ara 2003 02:51
Konum: Ankara
İletişim:

Mesaj gönderen sadettinpolat »

@Sahan33, biraz dikkatli olsan hic problem yasamayacaksin ama kodlari yazarken aklin kim bilir nerelerde ? :)

Kod: Tümünü seç

TBL_TABLO1.MUSTERI_ID = TBL_TABLO4.FIRMA_ADI 
demissin. musteri id integer bir deger firma_adi string bir deger. bu ikisi esit ciksa zaten ortada bir sorun var demektir. join yaparken iki tablodaki iliskili alanlar uzerinden bunu saglayacaksin

Kod: Tümünü seç

TBL_TABLO1.MUSTERI_ID = TBL_TABLO4.ID 
gibi

join ifadelerini su sekilde degistir ve biraz dikkatini toplamaya calis ;)

Kod: Tümünü seç

INNER JOIN TBL_TABLO2 ON TBL_TABLO1.ID = TBL_TABLO2.KAYIT_NO
INNER JOIN TBL_TABLO3 ON TBL_TABLO1.ULKE_ID = TBL_TABLO3.id
INNER JOIN TBL_TABLO4 ON TBL_TABLO1.MUSTERI_ID = TBL_TABLO4.id
INNER JOIN TBL_TABLO4 ON TBL_TABLO1.YETKILI_ID = TBL_TABLO4.id
"Sevmek, ne zaman vazgececegini bilmektir." dedi, bana.

---
http://sadettinpolat.blogspot.com/
SAHAN33
Üye
Mesajlar: 36
Kayıt: 24 Eki 2006 04:34

Mesaj gönderen SAHAN33 »

Proje bitme aşamasına geldi . Bu aralar da o kadar çok yogun bir şekilde çalışıyoruz kii. :) Artık bu tarz hataların gözden kaçmasına pek şaşmıyorum.

Baktım şimdi sonuçlar dönmeye başladı. Detaylı incelemedim ama Sana güveniyorum. Nasıl teşekkür etsem bilmiyorum. Çok Çok sağolasın. Allah senle beraber bilgisayarına da zeval vermesin.. Çok sağolasın..
SAHAN33
Üye
Mesajlar: 36
Kayıt: 24 Eki 2006 04:34

Mesaj gönderen SAHAN33 »

Hocam yine ben. Sanırım artık kızmaya başlıyorsun ama bak bu sefer de sende hatayı görmemişsin. dataları gönderim yaa. Tablo 4 içine aynı firmaya ait farklı yetkili kişiler tanımlamıştım. Firma Adı sorgu sonucu dönüyor ama yetkili kişi isimleri hep aynı kişi.
Tablo içinde
ID, FIRMA_ADI,YETKILI
1,deneme firması,Ali Veli
2,deneme firması, ahmet mehmet
3,deneme firması, deneme kişisi
.
.
gibi kayıtların hareketlerinde hep aynı kişi ismi geliyor.

Tablo 1 içinde
ID,TARIH,ULKE_ID,FIRMA_ID,YETKILI_ID
1,01.01.2008,6,1,2
2.02.01.2008,6,2,3
.
.
kayıtlarını sorguda getirirken Yetkili_ID 2 ve 3 oldugundan aynı firma adına karşılık ahmet mehmet ve deneme kişisi bilgilerini getirmek yerine sorgu her iki kayıt için ahmet mehmet bilgisini getiriyor. Sanki her iki işlemi ahmet mehmet onaylamış gibi...


Düşünün ki aynı firmaya farklı zamanlarda farklı kişilerin onayladığı ürünler gitti. Ama bu sorguda hep aynı kişi onaylamış gibi görünüyor. Benim en büyük sıkıntım bu zaten. O firma kaydında tanımlı ama farklı isimler sorguda tek bir isim olarak geliyor. Daha doğrusu Tablo4 sorgusunda hangi kaydın üzerindeyse o kayda ait firma ismi ve yetkilisini getiriyor. Firması aynı olup yetkilisi farklı olan kayıtlar gelmiyor.

Farkındayım biraz karışık bir durum Umarım derdimi anlatabilmişimdir. :( Datayı bir inceleyebilir misiniz. Hatta imkanınız varsa sorguyu kendi bilgisayarınızda alıp sonuçları değerlendirebilir misiniz ?
Cevapla