Join (Birleştirmede Sorun)

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
Kullanıcı avatarı
pro_imaj
Kıdemli Üye
Mesajlar: 1364
Kayıt: 18 Oca 2005 05:45
Konum: Dünyadan

Join (Birleştirmede Sorun)

Mesaj gönderen pro_imaj »

Merhaba,

Arkadaşlar, Birleştirme işlemi yapıyorum ama çok fazla kayıt geliyor ekrana.

Ana Table FINSAT485.SPI Diğer tablelerden isimleri vs almam gerek yaptığım birleştirme işlemi

Kod: Tümünü seç

SELECT FINSAT485_SPI.SiparisDurumu, FINSAT485_CHK.Unvan1, FINSAT485_SPI.Tarih, FINSAT485_SPI.TahTeslimTarih, FINSAT485_SPI.Kod7, FINSAT485_SPI.Aciklama, FINSAT485_SPI.Kod14, FINSAT485_SPI.Kod13, FINSAT485_STK.TipKod, FINSAT485_SPI.Kod12, FINSAT485_SPI.Kod11, (FINSAT485_SPI!Kod11)*(FINSAT485_SPI!Kod12) AS SiparisEdilenMetre, (FINSAT485_SPI!Kod11*FINSAT485_SPI!Kod12)*FINSAT485_SPI!Kod14 AS SiparisEdilenM2, ((FINSAT485_SPI!Kod11*FINSAT485_SPI!Kod12)*FINSAT485_SPI!Kod14*FINSAT485_SPI.Kod13)/100 AS SiparisEdilenKG, (FINSAT485_STI!Kod11)*(FINSAT485_STI!Kod12) AS TeslimEdilenMetre, (FINSAT485_SPI!Kod11*FINSAT485_SPI!Kod12)*FINSAT485_SPI.Kod14 AS TeslimEdilenM2, (((FINSAT485_STI!Kod11*FINSAT485_STI!Kod12)*FINSAT485_STI.Kod14)*FINSAT485_STI.Kod13)/100 AS TeslimEdilenKG, (FINSAT485_SPI!Kod11)*(FINSAT485_SPI!Kod12)-(FINSAT485_STI!Kod11*FINSAT485_STI!Kod12) AS KalanMetre, ((FINSAT485_SPI!Kod11*FINSAT485_SPI!Kod12)*FINSAT485_SPI!Kod14)-((FINSAT485_STI!Kod11*FINSAT485_STI!Kod12)*FINSAT485_STI.Kod14) AS KalanM2, (((FINSAT485_SPI!Kod11*FINSAT485_SPI!Kod12)*FINSAT485_SPI!Kod14*FINSAT485_SPI.Kod13)/100)-((((FINSAT485_STI!Kod11*FINSAT485_STI!Kod12)*FINSAT485_STI.Kod14)*FINSAT485_STI.Kod13)/100) AS KalanKG, FINSAT485_SPI.EvrakNo, FINSAT485_SPI.Kod1, FINSAT485_SPI.IslemTur
FROM ((FINSAT485_SPI LEFT JOIN FINSAT485_STK ON FINSAT485_SPI.MalKodu = FINSAT485_STK.MalKodu) LEFT JOIN FINSAT485_CHK ON FINSAT485_SPI.Chk = FINSAT485_CHK.HesapKodu) LEFT JOIN FINSAT485_STI ON FINSAT485_SPI.SiraNo = FINSAT485_STI.SiparisSiraNo
WHERE (((FINSAT485_SPI.IslemTur)=1));
Yukarıdaki SQL kodundaki son satırlar yani birleştirme işlemleri Neden bu sorunu veriyor acaba

Not:FINSAT485.SPI Tablesi ana table yani bu tabledeki kayıt sayısı kadar kayıt olması gerekiyor. Diğer tablelerden bazı işlemler yaptırıyorum. Ama kayıt sayısı çook fazla çıkıyor.

Yardımlarınız için şimdiden teşekkür ederim.
Çalışmalarınızda başarılar arkadaşlar.
Gün gelecek, dilleri, elleri ve ayakları yapmış oldukları bütün kötülükleri tek tek bildirerek aleyhlerinde şahitlik edecektir. [Nur Suresi 24]
_________________
Kullanıcı avatarı
naile
Admin
Mesajlar: 1873
Kayıt: 11 Haz 2003 10:11

Mesaj gönderen naile »

pro_imaj yazdı:Yukarıdaki SQL kodundaki son satırlar yani birleştirme işlemleri Neden bu sorunu veriyor acaba
Hangi sorunu?
Kullanıcı avatarı
pro_imaj
Kıdemli Üye
Mesajlar: 1364
Kayıt: 18 Oca 2005 05:45
Konum: Dünyadan

Mesaj gönderen pro_imaj »

Merhaba Naile hanım;
Galiba pek açıklayıcı yazamadım çok özür dilerim.
Sorun şuydu birleştirme işlemi sonucunda FINSAT485.SPI tablesindeki vkayıt sayısı kadar kayıt dönmesi gerekiyordu ama çook fazla sonuç dönüyordu. Birleştirme işlemi yaparken (ara yazılım olunca :oops: ) Key olmayan durumlarda alanlar arasındaki birleştirmey dikkat etmek gerekiyormuş.

Ben sorunu Çözdüm Değerli Zamanınızı aldığım için özür dilerim. Biraz dikkat edince oldu.

Kod: Tümünü seç

SELECT FINSAT485.SPI.SiparisDurumu, FINSAT485.CHK.Unvan1, FINSAT485.SPI.Tarih, FINSAT485.SPI.TahTeslimTarih, FINSAT485.SPI.Kod7, FINSAT485.SPI.Aciklama, FINSAT485.SPI.Kod14, FINSAT485.SPI.Kod13, FINSAT485.STK.TipKod, FINSAT485.SPI.Kod12, FINSAT485.SPI.Kod11, (FINSAT485.SPI.Kod11)*(FINSAT485.SPI.Kod12) AS SiparisEdilenMetre, (FINSAT485.SPI.Kod11*FINSAT485.SPI.Kod12)*FINSAT485.SPI.Kod14 AS SiparisEdilenM2, ((FINSAT485.SPI.Kod11*FINSAT485.SPI.Kod12)*FINSAT485.SPI.Kod14*FINSAT485.SPI.Kod13)/100 AS SiparisEdilenKG, (FINSAT485.STI.Kod11)*(FINSAT485.STI.Kod12) AS TeslimEdilenMetre, (FINSAT485.SPI.Kod11*FINSAT485.SPI.Kod12)*FINSAT485.SPI.Kod14 AS TeslimEdilenM2, (((FINSAT485.STI.Kod11*FINSAT485.STI.Kod12)*FINSAT485.STI.Kod14)*FINSAT485.STI.Kod13)/100 AS TeslimEdilenKG, (FINSAT485.SPI.Kod11)*(FINSAT485.SPI.Kod12)-(FINSAT485.STI.Kod11*FINSAT485.STI.Kod12) AS KalanMetre, ((FINSAT485.SPI.Kod11*FINSAT485.SPI.Kod12)*FINSAT485.SPI.Kod14)-((FINSAT485.STI.Kod11*FINSAT485.STI.Kod12)*FINSAT485.STI.Kod14) AS KalanM2, (((FINSAT485.SPI.Kod11*FINSAT485.SPI.Kod12)*FINSAT485.SPI.Kod14*FINSAT485.SPI.Kod13)/100)-((((FINSAT485.STI.Kod11*FINSAT485.STI.Kod12)*FINSAT485.STI.Kod14)*FINSAT485.STI.Kod13)/100) AS KalanKG, FINSAT485.SPI.EvrakNo, FINSAT485.SPI.Kod1, FINSAT485.SPI.IslemTur
FROM ((FINSAT485.SPI LEFT JOIN FINSAT485.STK ON FINSAT485.SPI.MalKodu = FINSAT485.STK.MalKodu) LEFT JOIN FINSAT485.CHK ON FINSAT485.SPI.Chk = FINSAT485.CHK.HesapKodu) LEFT JOIN FINSAT485.STI ON (FINSAT485.SPI.Tarih = FINSAT485.STI.Tarih) AND (FINSAT485.SPI.SiraNo = FINSAT485.STI.SiraNo) AND (FINSAT485.SPI.IslemTur = FINSAT485.STI.IslemTur) AND (FINSAT485.SPI.EvrakNo = FINSAT485.STI.EvrakNo) AND (FINSAT485.SPI.Chk = FINSAT485.STI.Chk)
WHERE (((FINSAT485.SPI.IslemTur)=1));
Not: Ara yazılım yaptığım için işlem yaptığım vtdeki Birleştirme işlemini yaptığım alan Anahtar alan değilmiş bende sorunu 2 veri tabanındaki aynı alanları eşleştirerek çözüm.

Hatalı Olan

Kod: Tümünü seç

FROM ((FINSAT485_SPI LEFT JOIN FINSAT485_STK ON FINSAT485_SPI.MalKodu = FINSAT485_STK.MalKodu) LEFT JOIN FINSAT485_CHK ON FINSAT485_SPI.Chk = FINSAT485_CHK.HesapKodu) LEFT JOIN FINSAT485_STI ON FINSAT485_SPI.SiraNo = FINSAT485_STI.SiparisSiraNo

Düzeltilen :oops:

Kod: Tümünü seç

FROM ((FINSAT485.SPI LEFT JOIN FINSAT485.STK ON FINSAT485.SPI.MalKodu = FINSAT485.STK.MalKodu) LEFT JOIN FINSAT485.CHK ON FINSAT485.SPI.Chk = FINSAT485.CHK.HesapKodu) LEFT JOIN FINSAT485.STI ON (FINSAT485.SPI.Tarih = FINSAT485.STI.Tarih) AND (FINSAT485.SPI.SiraNo = FINSAT485.STI.SiraNo) AND (FINSAT485.SPI.IslemTur = FINSAT485.STI.IslemTur) AND (FINSAT485.SPI.EvrakNo = FINSAT485.STI.EvrakNo) AND (FINSAT485.SPI.Chk = FINSAT485.STI.Chk)
Saygılarımla
Çalışmalarınızda Başarılar.
Gün gelecek, dilleri, elleri ve ayakları yapmış oldukları bütün kötülükleri tek tek bildirerek aleyhlerinde şahitlik edecektir. [Nur Suresi 24]
_________________
Kullanıcı avatarı
undefined
Moderator
Mesajlar: 565
Kayıt: 06 Eki 2003 12:01
Konum: Bursa
İletişim:

Mesaj gönderen undefined »

Bu SQL e bakınca benim başım dönüyor :)
Kullanıcı avatarı
pro_imaj
Kıdemli Üye
Mesajlar: 1364
Kayıt: 18 Oca 2005 05:45
Konum: Dünyadan

Mesaj gönderen pro_imaj »

undefined yazdı:Bu SQL e bakınca benim başım dönüyor :)
Hocam projeye yeni başladım zaten Analizi yeni bitirdim bu saatten sonra projeyi bıraktırma bana :D

Benimde Gözüm korktu ya şöyle bir bakınca :D

Saygılar hocam.
Allah (cc) kolaylıklar versin hepimize ne diyelim istekler sınırsız.
Gün gelecek, dilleri, elleri ve ayakları yapmış oldukları bütün kötülükleri tek tek bildirerek aleyhlerinde şahitlik edecektir. [Nur Suresi 24]
_________________
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Mesaj gönderen rsimsek »

Gerçekten çok karışık :? Gerekli kayıtları bir SP içinde çekip işlemleri orada adım adım yapman daha akıllıca olur. Çünkü sen bile iki gün sonra bu sorguyu okumakta zorluk çekeceksin :idea:
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
Kullanıcı avatarı
musti
Üye
Mesajlar: 527
Kayıt: 11 Tem 2005 09:44

Mesaj gönderen musti »

hocam iyiki senden önce sql ve join kullanmışım. Yoksa bu mesajı okuduktan sonra belki 50 sene gecse dönüp bakarsam ne olayım derdim.
Kullanıcı avatarı
pro_imaj
Kıdemli Üye
Mesajlar: 1364
Kayıt: 18 Oca 2005 05:45
Konum: Dünyadan

Mesaj gönderen pro_imaj »

musti yazdı:hocam iyiki senden önce sql ve join kullanmışım. Yoksa bu mesajı okuduktan sonra belki 50 sene gecse dönüp bakarsam ne olayım derdim.
:D

Hocam istekler sınırsız. Birde kendi veri yapın olmayancı Bkz. (yani ben) o zaman işler daha da kötü. (Bu kodlar Güneş. programramına yazdığım ek bir yazılım için.) Tarih alanları sayı tutulmuş herşeye bir kod verilmiş kullanıcı bunu istemiyor bu kodun şimdiki halini Zarar vereceği için atmak istemiyorum. :D

Saygılarımla
Çalışmalarınızda başarılar
Gün gelecek, dilleri, elleri ve ayakları yapmış oldukları bütün kötülükleri tek tek bildirerek aleyhlerinde şahitlik edecektir. [Nur Suresi 24]
_________________
Kullanıcı avatarı
Kuri_YJ
Moderator
Mesajlar: 2248
Kayıt: 06 Ağu 2003 12:07
Konum: İstanbul
İletişim:

Mesaj gönderen Kuri_YJ »

Selamlar,

Bir tavsiye,

Kod: Tümünü seç

  SELECT TABLOADI1.FIELDADI1, TABLOADI1.FIELDADI2, TABLOADI1.FIELDADI3 * TABLOADI1.FIELDADI4, ((TABLOADI1.FIELDADI5 + TABLOADI2.FIELDADI1)  / TABLOADI2.FIELDADI2) - TABLOADI2.FIELDADI3 AS YENIFIELDADI1, TABLOADI2.FIELDADI2, TABLOADI2.FIELDADI3, (TABLOADI2.FIELDADI4 + TABLOADI3.FIELDADI1) AS YENIFIELDADI2, TABLOADI2.FIELDADI5, TABLOADI3.FIELDADI2, TABLOADI3.FIELDADI3, TABLOADI3.FIELDADI4, TABLOADI3.FIELDADI5 FROM TABLOADI1 LEFT OUTER JOIN TABLOADI2 ON TABLOADI1.FIELDADILINK = TABLOADI2.FIELDADILINK LEFT OUTER JOIN TABLOADI3 ON TABLOADI1.FIELDADILINK = TABLOADI3.FIELDADILINK WHERE TABLOADI1.FIELDADIKOSUL1 >= :STR_BASLANGIC_KOSUL1 AND TABLOADI1.FIELDADIKOSUL1 <= :STR_BITIS_KOSUL1 AND (TABLOADI1.FIELDADIKOSUL2 = :STR_KOSUL2 OR TABLOADI1.FIELDADIKOSUL3 = :STR_KOSUL3)
Yukarıdaki SQL cümlesini daha anlaşılır biçimde yazalım.

Kod: Tümünü seç

  SELECT TABLOADI1.FIELDADI1, TABLOADI1.FIELDADI2, TABLOADI1.FIELDADI3 * TABLOADI1.FIELDADI4, ((TABLOADI1.FIELDADI5 + TABLOADI2.FIELDADI1)  / TABLOADI2.FIELDADI2) - TABLOADI2.FIELDADI3 AS YENIFIELDADI1, TABLOADI2.FIELDADI2, TABLOADI2.FIELDADI3, (TABLOADI2.FIELDADI4 + TABLOADI3.FIELDADI1) AS YENIFIELDADI2, TABLOADI2.FIELDADI5, TABLOADI3.FIELDADI2, TABLOADI3.FIELDADI3, TABLOADI3.FIELDADI4, TABLOADI3.FIELDADI5 
FROM TABLOADI1 
  LEFT OUTER JOIN TABLOADI2 ON TABLOADI1.FIELDADILINK = TABLOADI2.FIELDADILINK 
  LEFT OUTER JOIN TABLOADI3 ON TABLOADI1.FIELDADILINK = TABLOADI3.FIELDADILINK 
WHERE TABLOADI1.FIELDADIKOSUL1 >= :STR_BASLANGIC_KOSUL1 
  AND TABLOADI1.FIELDADIKOSUL1 <= :STR_BITIS_KOSUL1 
  AND (TABLOADI1.FIELDADIKOSUL2 = :STR_KOSUL2 
       OR TABLOADI1.FIELDADIKOSUL3 = :STR_KOSUL3)
Fena değil ama biraz daha anlaşılır biçimde yazabiliriz,

Kod: Tümünü seç

  SELECT TABLOADI1.FIELDADI1, 
         TABLOADI1.FIELDADI2, 
         TABLOADI1.FIELDADI3 * TABLOADI1.FIELDADI4, 
         ((TABLOADI1.FIELDADI5 + TABLOADI2.FIELDADI1)  / TABLOADI2.FIELDADI2) - TABLOADI2.FIELDADI3 AS YENIFIELDADI1, 
         TABLOADI2.FIELDADI2, 
         TABLOADI2.FIELDADI3, 
         (TABLOADI2.FIELDADI4 + TABLOADI3.FIELDADI1) AS YENIFIELDADI2, 
         TABLOADI2.FIELDADI5, 
         TABLOADI3.FIELDADI2, 
         TABLOADI3.FIELDADI3, 
         TABLOADI3.FIELDADI4, 
         TABLOADI3.FIELDADI5 
FROM TABLOADI1 
  LEFT OUTER JOIN TABLOADI2 ON TABLOADI1.FIELDADILINK = TABLOADI2.FIELDADILINK 
  LEFT OUTER JOIN TABLOADI3 ON TABLOADI1.FIELDADILINK = TABLOADI3.FIELDADILINK 
WHERE TABLOADI1.FIELDADIKOSUL1 >= :STR_BASLANGIC_KOSUL1 
      AND TABLOADI1.FIELDADIKOSUL1 <= :STR_BITIS_KOSUL1 
      AND (TABLOADI1.FIELDADIKOSUL2 = :STR_KOSUL2 
           OR TABLOADI1.FIELDADIKOSUL3 = :STR_KOSUL3)
Sizce nasıl oldu? :) SQL Cümlesi yazarken özellikler, SELECT, FROM, JOIN , WHERE gibi parçaların her birini yeni bir satırla başlatın. Eğer çok Alan Adı (Field Adı) var ise ve hesaplar yapıyorsanız, mümkün mertebe hepsini ayrı satıra yazarsanız, okunaklı bir SQL Cümlesi yazmış olursunuz.

Şunu unutmayın, düzgün ve formatlı yazarken harcayacağınız fazladan zaman (ki ben bunun fazladan zaman olduğunu düşünmüyorum) hata ayıklarken veya sorun çözerken harcayacağınız zamandan çok daha kısa olur ve sizi yormaz. Hata ayıklarken cümleyi okumakla cebelleşmek ve hatanın nerede olduğunu keşfetmek daha çok zaman alacaktır. Ayrıca yorucudur, sıkıcıdır.

Karmaşık ve anlaşılmaz cümleler sizin ne kadar iyi bir programcı olduğunuzu göstermez, tersine acemliğinizi gösterir. Usta programcılar, karmaşık cümlelerden kaçınır, sağlam kod yazar. Bol açıklama satırı yazar kaynak kodunun içine. Ne makinayı (çalışma zamanını düşünerek) ne kendini (hata ayıklama zamanını düşünerek) ne de kullanıcıyı (çalışma zamanında kullanıcıyı) yormayacak kod yazar.

Tavsiyedir, böyle yapılması gerek değildir elbet. Her yiğidin farklı yoğurt yiyişi vardır. Bunlar benim tecrübelerimden derlenmiş özet bilgidir.

Herkese kolay gelsin.
Kuri Yalnız Jedi
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
Kullanıcı avatarı
pro_imaj
Kıdemli Üye
Mesajlar: 1364
Kayıt: 18 Oca 2005 05:45
Konum: Dünyadan

Mesaj gönderen pro_imaj »

Kuri_YJ yazdı:Selamlar,
Karmaşık ve anlaşılmaz cümleler sizin ne kadar iyi bir programcı olduğunuzu göstermez, tersine acemliğinizi gösterir.
Merhaba; @Kuri_YJ

Yukarıdaki yazdığınız kod bloklarına katılmakla birlikte sizin yazdığınız gibi bir düşünce içersinide hangi geri zekalı olabilr acaba. Ben kendi derdime düşmüşüm projeyi yetiştirmek için sadece alal acele yazdığım ve çözemediğim kodu buraya yapıştırdım. Sizin bunu bu şekilde algılamanızbir talihsizlik olarak nitelendirmek gerkiyor.

İyi bir yazılımcı veya SQL bilgimin iyi olduğunu kimse idda etmiyor ben dahil.

Neyse amacım tartışma ortamı yaratmak kesinlikle diil ama çok uç konuşmalardan rahatsız olduğumu dile getirmek istedim.


Not: 2 üstteki mesajıma bakarsanız sadece birleştirme alanlarını kod blokları halinde verip hatalı olan düzeltilen diye nitelendirdim.
Saygılarımla
Çalışmalarınızda başarılar.
Gün gelecek, dilleri, elleri ve ayakları yapmış oldukları bütün kötülükleri tek tek bildirerek aleyhlerinde şahitlik edecektir. [Nur Suresi 24]
_________________
Kullanıcı avatarı
Kuri_YJ
Moderator
Mesajlar: 2248
Kayıt: 06 Ağu 2003 12:07
Konum: İstanbul
İletişim:

Mesaj gönderen Kuri_YJ »

Selamlar Pro_imaj,

Yazdıklarımı okuduğumda senin böyle anlamış olmanı çok yadırgamadım. :) Yazdıklarım seni eleştirmek manasında değildi. Öncelikle bu yanlış anlaşılmayı ortadan kaldıralım :) Alınganlık yapmışsın ama senin için değildi yazdıklarım.

Yazdığımı, makalelere mi yazsam yoksa buraya mı yazsam diye tereddüt etmiştim ama hazır konu açılmışken buraya yazmayı uygun gördüm.

Yazdığım seni eleştirmek için değildi, öncelikle bunu bil. Sonra bu anlattıklarım, başlıkları takip eden yeni arkadaşlarımıza tavsiye niteliğindeydi. Özellikle, paragrafları parça parça alıp incelersen seni eleştiriyormuşum anlamı çıkar ama o şekilde bakma lütfen. Dediğim gibi bütün olarak inceleyip, yazdıklarımın aslında tecrübesiz arkadaşlara tavsiye niteliğinde olduğunu görürsün.

Aşkolsun yani !!!! :) Kızarak ve yererek eleştirdiğim tek bir şey var o da M$ :) Yoksa sen M$'da mı çalışıyorsun?

İşin esprisi bir yana bu şekilde yanlış anlaşılmak beni şaşırttı ve açıkçası biraz üzdü. Bu şekilde yanlış anlaşılmaya sebep verecek şekilde yazı yazdığım için senden özür dilerim ama hakikaten yazdığım seni eleştirmek için değildi !...

Herkese Kolay Gelsin
Kuri Yalnız Jedi
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
Kullanıcı avatarı
pro_imaj
Kıdemli Üye
Mesajlar: 1364
Kayıt: 18 Oca 2005 05:45
Konum: Dünyadan

Mesaj gönderen pro_imaj »

Kuri_YJ yazdı: Aşkolsun yani !!!! :) Kızarak ve yererek eleştirdiğim tek bir şey var o da M$ :) Yoksa sen M$'da mı çalışıyorsun?
:D
Merhaba @Kuri_YJ hocam. Gerçekten bende kendimi MSSQL SERVER kullandığım için eleştiriyorum. Ama şartlar böyle yapmamı gerektiriyor.

Hocam ben seni kırıcı bişey söylediysem özür dilerim.:oops: Senin kötü bir amacın olmadığını biliyorum zaten. Tartışma yapmak içinde yazmadım sadece yanlış anldım. :roll:

Tekrar özür dilerim.
Çalışmalarınızdaki başarılarınızın daim olması dileğiyle.
Sağlıcakla kalınız.
Gün gelecek, dilleri, elleri ve ayakları yapmış oldukları bütün kötülükleri tek tek bildirerek aleyhlerinde şahitlik edecektir. [Nur Suresi 24]
_________________
Cevapla