En iyi yanıtlayıcılar
İki tabloyu birleştirme

Soru
-
Merhaba,
Aşağıdaki gibi örnek iki tablo bulunmakta;
Tablo1:
il_kodu; il_adi; ilce_adi; katsayi
05; Amasya; Merkez; 5
05; Amasya; Merzifon; 10
06; Ankara; Merkez; 2
06; Ankara; Çankaya; 3
06; Ankara; Sincan; 7
Tablo2:
il_kodu; kurum_adi
05; İl Afet Kurumu
05; Merzifon Belediyesi
06; İl Afet Kurumu
06; Çankaya Belediyesi
06; Sincan Belediyesi
06; İl Milli Eğitim Müdürlüğü
Bu iki tabloyu iki tablodaki il_kodu ve Tablo1'deki ilce_adi ile Tablo2'deki kurum_adi nın ilk kelimesini alarak birleştirmek istiyorum. Eğer Tablo2'deki kurum_adi ndaki ilk kelime Tablo1'deki bir ilçe adına denk gelmezse o ildeki Merkeze eşit olmasını istiyorum.
Sorguyu aşağıdaki gibi yazdım ama istediğim sonucu alamadım.
SELECT t1.il_kodu, t1.il_adi, t1.ilce_adi, t2.kurum_adi, t1.oran
FROM Tablo1 as t1
INNER JOIN Tablo2 as t2
ON t1.il_kodu = t2.il_kodu AND ( t1.ilce_adi = ( LTRIM(RTRIM(SUBSTRING(t2.kurum_adi, 0, CHARINDEX(' ', t2.kurum_adi+' ')))) OR t1.ilce_adi = 'Merkez' )
Sorun herhangi bir ilçe adı ile başlamayan (örn: İl Milli Eğitim Müdürlüğü) kurum adlarında. Bunların Merkeze eşit olması gerekiyor. Ayrıca İlçe adı ile başlayanlar da Tablo1 deki hem o ilçenin olduğu satır ile hem de Merkezin olduğu satır ile eşleniyor.
Sorguyu düzenlemek için yardımlarınızı bekliyorum.
Yanıtlar
-
Merhaba,
Farklı tablolarındaki kayıtları eşleştirmek için kullanmak istediğin bu yöntem çok başını ağrıtır. Her şeyden önce performans açısından çok sorunlu bir yöntem bu. Join ve Where Predicate'lerinin indekslerden azami derecede yararlanmasını istersen, ki istersin, o zaman Predicate'lerde Function kullanmaman gerekir.
Diğer nokta ise kodlama açısından hiç pratik bir yöntem olmaması, ama performans ile kıyasladığında bu neredeyse önemsiz kalıyor.
Sana tavsiyem, mesela belediyeler, müdürlükler, kurumlar vd. için farklı tip numaraları kullanman ve eşleştirmeleri buna göre yapman. Böylece kelimeleri değil, sayısal kodları eşleştirirsin. Hem çok daha performanslı olur, hem de böyle bilmece-bulmacalarla uğraşmamış olursun.
http://ekremonsoy.blogspot.com | http://www.ekremonsoy.com | @EkremOnsoy
- Yanıt Olarak İşaretleyen Ekrem Önsoy 28 Eylül 2017 Perşembe 09:20
Tüm Yanıtlar
-
Merhaba,
Direk tablo 2 ile joinlemek yerine , tablo 2 üzerine bir view oluşturup , select inde koşul yazıp , eğer ilçe ismi yazmaz İl Milli Eğitim Müdürlüğü gibi isimlerde Merkes yazmasını sağlar , sonra bu view i joine ekleyebilirsin. Yada benzer yapıda joinde subquery ekleyip , bu dediğim düzenlemeleri subquery de yapıp o şekilde yapabilirsin.
-
Merhaba,
Farklı tablolarındaki kayıtları eşleştirmek için kullanmak istediğin bu yöntem çok başını ağrıtır. Her şeyden önce performans açısından çok sorunlu bir yöntem bu. Join ve Where Predicate'lerinin indekslerden azami derecede yararlanmasını istersen, ki istersin, o zaman Predicate'lerde Function kullanmaman gerekir.
Diğer nokta ise kodlama açısından hiç pratik bir yöntem olmaması, ama performans ile kıyasladığında bu neredeyse önemsiz kalıyor.
Sana tavsiyem, mesela belediyeler, müdürlükler, kurumlar vd. için farklı tip numaraları kullanman ve eşleştirmeleri buna göre yapman. Böylece kelimeleri değil, sayısal kodları eşleştirirsin. Hem çok daha performanslı olur, hem de böyle bilmece-bulmacalarla uğraşmamış olursun.
http://ekremonsoy.blogspot.com | http://www.ekremonsoy.com | @EkremOnsoy
- Yanıt Olarak İşaretleyen Ekrem Önsoy 28 Eylül 2017 Perşembe 09:20