1 Son düzenleyen, Berker (13.06.2012 09:20:59)

Konu: select cümleciği ile ilgili

herkese merhaba,
üstatlar,öğrenciyim. çok fazla bilgim yok çoğu şey temelden ibaret. bu nedenle sorum çok basit gelebilir, forumları hep aradım taradım bulamadım ufak bir yardıma ihtiyacım var.
üstatlar mesaj uzun olacak umarım sıkılmazsınız okurken smile
şimdi;
aslında daha uzun ama ben hem örnek vericem hemde kısaltıcam istediğim şeyi. bizim veritabanımızda bir tablo var. bu tabloda Ad Soyad TCKimlik ve Şehir var diyelim. fakat bu bilgiler eskimiş artık şehirler değişmiş soyadlar vs değişmiş yada yanlış fazla olabilir.
excel de ise yeni bilgiler var. benden istenilen excel deki veriler doğru veri olduğu için, veritabanındaki veriler ile TCkimlik numaraları eşleştiği anda exceldeki yeni veriler geçerli olacak diğerleri iptal. buraya kadar herşey güzel, exceli import ettim, önceki tablo "Liste", yeni gelen tablo "YeniListe" dedim.
örnek kodu yazayım.
SELECT YeniListe.Ad, YeniListe.Soyad, liste.TCKimlik ,YeniListe.TCKimlik YenListe.Sehir FROM liste
INNER JOIN YeniListe ON liste.TCKimlik=YeniListe.TCKimlik

bu şekilde inner join li select cümlesini yazdığımda yukarıdaki istenilen select cümlesi geliyor, ardından sorgudan çıkan sonucu kopyalayıp excel e attıktan sonra exceli tekrar import edip sonucu elde ediyorum.
fakat;
benden 2.bir istenilen var, tüm bunları yaparken aynı zamanda yeni listede olupta eski listede yoksa onlarda listeye dahil olacak.

bu select cümlesine ne yaptıysam bu 2. istenileni ekleyemiyorum hmm
tekrardan kısaca, sorgudan çıkan sonuç, yani hem TC kimlik numaraları uyuştuğu anda yeni listedeki bilgiler geçerli olacak, hem eski listede fazlalık varsa onlar silinecek, hemde yeni listede olupta eskisinde yoksa onlar dahil olacak.

ben birde selectten çıkan sonucu kopyala yapıştır mantığı ile excele atıp çekmeyi planladım. fakat hamallığı daha az olan başka bir yol varsa t-sql komutlu vs öyle bir yol varsa o yoluda tercih edebilirim.

yardımlarınız için şimdiden çok teşekkürler.
not: bu arada yanlış başlık altına konu açtım sanırım, veritabanı tablo falan görünce buraya yazdım şimdi farkettim sql server diye ayrı başlık varmış yanlış yere açmışsam kusura bakmayın smile

2

Re: select cümleciği ile ilgili

Merhaba, hosgeldin:) Sana hemen bir tavsiye. Cevap sansini arttirmak istiyorsan, sorunu kisa ve oz anlat ve de mumkunse ornek ver. Uzun uzun hikaye okumak zor geldiginden pas gecilen cok soru var (kendi adima oyle en azindan).

Sorun birkac parcadan olusuyor:
1) Excel'den veri almak. Import basta cazip gorunse de unut gitsin. Onun yerine OLEDB veya ODBC ile baglanip veriyi almak daha saglikli. Ornek kodlar icin buraya bak:

http://www.foxite.com/archives/0000153776.htm

2) Excelden alma kismini hallettin ve gelen "YeniListe" eskisi ise "Liste" olarak hazir. Onlari duzeltmek istiyorsun ama kafa karistiran bir istek var ortada:

benden 2.bir istenilen var, tüm bunları yaparken aynı zamanda yeni listede olupta eski listede yoksa onlarda listeye dahil olacak.

bu select cümlesine ne yaptıysam bu 2. istenileni ekleyemiyorum
tekrardan kısaca, sorgudan çıkan sonuç, yani hem TC kimlik numaraları uyuştuğu anda yeni listedeki bilgiler geçerli olacak, hem eski listede fazlalık varsa onlar silinecek, hemde yeni listede olupta eskisinde yoksa onlar dahil olacak.

Bu soylediklerinden benim anladigim, eger TC kimlik bazli satir:
1) Yeni ve eskide var - Yeni gecerli
2) Yeni de var sadece - Gecerli.
3) Sadece eskide var - Fazlalik? Sil?

Eger boyle ise, eskinin hicbir fonksiyonu yok demektir. Yeniyi kullan gec.

Sanirim demek istedigin:
1) Sadece yeni veya sadece eskide olanlari oldugu gibi al.
2) Ikisinde de var ise yeniden al.

Dogru anlamis isem:

Visual Fox Pro
select * from yeniListe ;

union ;
select * from eskiListe where TCKimlik not in (select tcKimlik from yeniListe)

3 Son düzenleyen, Berker (13.06.2012 14:46:20)

Re: select cümleciği ile ilgili

hoşbulduk hocam, tavsiyenizi dikkate alıcam uzun yazdım kusura bakmayın smile
import işlemini kenara atıyorum o zaman, OLEDB VE ODBC yi öğreniyim,
hocam haklısınız normalde eski listenin fonksiyonu yok düşününce,
fakat staj yapıyorum, stajda benden bunu istediler.
ne amaçla istediler bilmiyorum, takıldım kaldım
yazdığınız koduda çalıştırdım eski listeden eşleşmeyenlerde dahil oldu dediğiniz gibi.
peki eski listenin fonksiyonu olmasa dahi, yinede istediğim şekilde yapma şansımız varmı? belkide nasıl bir kod yazacağımı merak etmişlerdir, çünkü yardımda etmiyorlar smile

4

Re: select cümleciği ile ilgili

O zaman ne yaptigini anlatmak daha faydali olacak:

Visual Fox Pro
select yeni.* from yeniListe yeni inner join eski on yeni.TCKimlik = eski.TCKimlik

Bu kod:
1) Inner join kullaniyor. Anlami eger TCKimlik her ikisinde de var ise bu kayit sonuclarda yer alacak. Sadece yeni veya sadece eskide olanlar safdisi.

2) "from yeniListe yeni" diyerek yeniListe ye bu SQL'de gecerli olan gecici bir alias (lakap) koyuyoruz. Tek amaci uzun uzun yeniListe yazmak yerine daha kisa 'yeni' olarak cagirmak (cok onemli oldugu yer de var ama genelde daha kisa alias amaciyla kullaniliyor).

3) Eslesme sonucunda sadece yeniListe'nin alanlarini almak istedigim icin:

Visual Fox Pro
select yeni.*

Buraya kadar yaptigimiz eslesenler icin sadece yeniListenin kayitlarini almak (oncelikle ayri SQLler seklinde yapiyoruz anlamak icin)

Simdi sadece yenide olanlar. Bunu almanin birkac degisik yolu var. Temel olarak 3 yol.
a)

Visual Fox Pro
select * from yeniListe where TCKimlik not in (select TCKimlik from eski)

Bu syntax kendini anlatiyor ve kullanimi kolay. "TCKimlik eskide olmayanlar" anlaminda.
SQL serverda kullanirken eger TCKimlik alani null deger kabul ediyorsa beklenmedik sonuclar alabilirsin. O nedenle genelde diger iki yolu da bilmende fayda var.

b)

Visual Fox Pro
select * from yeniListe where not exists (select 1 from eski where eski.TCKimlik = yeniListe.TCKimlik)

Genelde tercih edilen syntax. Hiz acisindan da en iyi sonucu veriyor (gerci farklar milisaniyeler civarinda eger heyula gibi verin yoksa:)

burada "Select 1" kafani karistirmasin. 1 yerine * veya TCKimlik olabilirdi. O data secilmiyor sadece var mi yok mu bakiliyor.

c)

Visual Fox Pro
select yeni.* from yeniListe yeni left join eski on yeni.TCKimlik = eski.TCKimlik where eski.TCKimlik is null

Burada "Left join" kullandik. Anlami Left yani soldaki (yani YeniListe) tablodan tum kayitlari getir, uyan olsa da olmasa da. Eskiden ise sadece uyanlar gelecek. Yeniden hepsi geldikten sonra "where eski.TCKimlik is null" ile bir filtreleme yapiyoruz. NULL ozel bir veri ve "bilinmeyen" "olmayan" deger anlaminda. Left ile almistik, bir TCKimlik sadece yenide var ise o satirda 'eski'den gelen tum kolonlardaki degerler NULL. Bu durumdan faydalaniyoruz. Orada NULL o where filtresiyle sadece yenide olanlari aliyoruz.

Bize gerekli olan kayitlari iki farkli SQL ile aldik. Simdi ikisini birlestirmek icin "union" kullaniyoruz:

Visual Fox Pro
select yeni.* from yeniListe yeni inner join eski on yeni.TCKimlik = eski.TCKimlik ;

union ;
select * from yeniListe where not exists (select 1 from eski where eski.TCKimlik = yeniListe.TCKimlik)

Union iki SQL sonucunu (VFP kullaniyorsan, kolon sayilari, tipleri ayni olmali. Burada ayni) alt alta birlestiriyor ve tamamen ayni olan satirlari da teke indiriyor (union ALL ile bu duplikasyon kaldirma islemi engellenebilir ama buraya uyuyor mantik olarak).

Tabii yukaridaki SQL'in efektif sekli:

Visual Fox Pro
select yeni.* from yeniListe

smile Kulagimizi tersten gosterdik ve ikisinde de olanlar + sadece yenide olanlar olarak aldik.

5

Re: select cümleciği ile ilgili

hocam vakit ayırıp yardımcı olduğun için gerçekten çook teşekkürler, bu kadar açıklamalı güzel başka türlü anlatılamazdı heralde, evdeyim şimdi, yarın staj yerinde yazdığın kodu deneyeceğim yada kendim burada 2dkda birkaç veri oluşturup denerim yazdıklarını.
tekrardan sağol. inşallah günün birinde sizin gibi böyle anlatabileceğim birileri olur benimde smile

6

Re: select cümleciği ile ilgili

hocam ufak bir sorun daha var sizin daha önce unionlu vermiş olduğunuz aşağıdaki kod sorunsuz çalışıyo;

select * from YeniListe
UNION 
select * from liste where TCKimlik not in (select TCKimlik from YeniListe)

fakat daha sonra yazmış olduğunuz;

select yeni.* from YeniListe yeni inner join liste on yeni.TCKimlik = liste.TCKimlik ;
UNION
select * from YeniListe where not exists (select 1 from liste where liste.TCKimlik = YeniListe.TCKimlik)

bu kodda ;
Incorrect syntax near the keyword 'UNION'. hatası alıyorum.

union bildiğim kadarıyla order bylarda sorun çıkarıyor bunda yok, 2 listedede aynı column sayısı olmalı yani eşit olmalı diye biliyorum onlarda da sorun yok. zaten ilk yazdığınız kod da sorun yoktu, eğer öyle bir sorun olsaydı onda da olmalıydı. anlayamadım bu kodda union hatası alıyorum.
ayrıca 2 select cümleside ayrı ayrı tam söylediğiniz gibi çalışıyor.
nerede hata yapıyorum, neyi unuttum?

7

Re: select cümleciği ile ilgili

Hata mesajina bakilirsa sen bunu SQL serverda yaziyorsun. SQL server'da yeni satirda devam etmek icin noktali virgul (;) kullanilmiyor, VFP de kullaniliyor. SQL serverda sadece en sonda kullaniliyor (C gibi).

SQL
SELECT yeni.* FROM YeniListe yeni INNER JOIN liste ON yeni.TCKimlik = liste.TCKimlik 

UNION
SELECT * FROM YeniListe WHERE NOT EXISTS (SELECT 1 FROM liste WHERE liste.TCKimlik = YeniListe.TCKimlik) ;

8

Re: select cümleciği ile ilgili

evet farkettim hatanın sebebinin o olduğunu uniondan sonrada siz ";" koymuştunuz ben onu silmiştim, sql serverda çalışmıyor diye. Diğeri dalgınlığıma gelmiş sonradan gördüm ama buraya yazamadım, neyse benim gibi acemiler görürse işlerine yarar smile tekrar teşekkürler