24 Mayıs 2011 Salı

Sql'de İlişkili Tablolarda Güncelleme(Update-Join)

Sql'de update işlemleri yaparken, şu ana kadar hep tek tablo üzerinden yaptık. Peki, birbiriyle ilişkili birden fazla tabloda update işlemi yaparsak nasıl bir yol izleyeceğiz?

Cevap oldukça basit. Biz yine de daha anlaşılır olması bakımından, senaryo üzerinden gidelim. İki tablomuz olsun. Öğrenci tablosunda Numara ve Ad tutulsun, Not tablosunda da ÖgrenciNo ve Puan tutulsun.

create Table Ogrenci
(
       OgrenciNo int,
       OgrenciAd nvarchar(20)
)
create Table Puan
(
       OgrenciNo int,
       Puan int
)

OgrenciNo alanı, Ogrenci tablosunda PrimaryKey iken, Puan tablosunda ForeignKey'dir. Böylece iki tabloyu ilişkilendirmiş olduk.

Birkaç kayıt girdikten sonra senaryomuz şöyle olsun. İsmi Ahmet Demir olan öğrencinin Puanını 50 yapalım. Gördüğünüz gibi tek tabloda update işlemi yapıyor olmamıza rağmen, verilen koşul başka bir tabloda. Burada iki tabloyu join ile birleştirip, ardından update işlemini yapacağız. Yazmamız gereken kod şu şekilde olmalıdır.

update Puan set Puan=50 from Puan p join Ogrenci o on p.OgrenciNo=o.OgrenciNo where OgrenciAd='Ahmet Demir'

Gördüğünüz üzere, syntax olarak, select ile yapılan joinleme işlemine çok benzer. select * from Puan ile başlayan joinleme sorgumuz, burada update Puan set Puan=50 from Puan olmuştur. Sorgu sonucunda, ismi Ahmet Demir olan öğrenci/öğrenciler 'in aldığı puanlar 50 olarak güncellenmiştir.

5 yorum:

beyza dedi ki...

Merhaba benim bir sorum olacaktı.Aşağıdaki gibi bir select sorgum var.bunun updateini nasıl yapabilirim acaba?
(Select o.OgrenciNo,o.Adi,o.Soyadi,o.Cinsiyet,o.DevamDurumu,s.SinifNumarasi as Sınıf,su.SubeAdi as Şube from Ogrenci o left join Sinif s on o.SinifId=s.SinifId left join Sube su on su.SubeId=o.SubeId)

şu şekilde yazdım update sorgusunu fakat olmadı.doğrusunu nasıl yazabilirim yardımcı olur musunuz?
(Update Ogrenci set Adi=@ad,Soyadi=@soyad,Cinsiyet=@cins,DevamDurumu=@durum,Sinif.SinifNumarasi=@sinif,Sube.SubeAdi=@sube from Ogrenci o join Sinif s on o.SinifId=s.SinifId join Sube su on o.SubeId=su.SubeId where o.OgrenciNo='123')

Ergin Arslan dedi ki...

Merhaba, update işlemi yaparken, yazdığın sorguda sadece Ogrenci'yi update ettiğinden diğer tablolarda değişikliğe izin vermez. Yani Update Ogrenci set ... yazdığın için sadece Ogrenci tablosundan değişikliğe izin verir. update join işleminin amacı, birden fazla tablodaki(ilişkili) kolonları where şart koşuluna bağlamaktır. Sizin senaryo için önerim, transaction yazmanız. Update edilecek tablolar içn ayrı ayrı update sorgusu yazıp, bir sorun olmadığı taktirde sorguyu commit etmek en iyi seçenek gibi. Çünkü update sorgularından herhangi birinde sorun olmaması gerekir. Bunun da rollback yaparak önüne geçeriz. Transaction hakkında yardım da edebilirim ihtiyacın olursa.

beyza dedi ki...

İlginiz için çok teşekkür ederim.Taransaction hakkında bi bilgim yok.Biraz açıklarsanız çok iyi olur burada nasıl kıllanabilirim?

Ergin Arslan dedi ki...

transaction kısaca, yapmak istediğin bir işlemin gerçekleşmeme durumuna karşı yaptığın tüm işlemleri geri almak veya gerçekleşmesi durumunda onaylamak. klasik bir örnektir, banka para havale işlemlerinde, kendi hesabındaki parayı, başka bir hesaba aktarmak istediğini düşünelim. kendi hesabından parayı çektiğin anda elektrikler gitti diyelim. Bir şekilde bana para gönderemedin. Senin hesabından da çoktan çekildi para. Dolayısıyla bir hata oluştuğunda tüm işlemleri geri almak istersin(rollback). veya her şey düzgün gider onaylamak istersin(commit).

Şimdi sizin senaryonuz için konusursak,öncelikle update işlemlerinizi procedure içinde yazmanızı tavsiye ederim. procedure create ettikten sonra begin transaction diyip, update etmek istediğiniz her bir tablo için ayrı update sorguları yazıp, bunları try bloğu içine almanız. eğer catch'e düşerse rollback etmelisiniz, try'ın sonuna da commit yazarsanız sorunsuz çalıştığı anlamına gelir. Yani;

create procedure xxx
...
begin transaction
try
begin
update ogrenci set ....
update sube set ....
update sinif set ....
commit
end
catch
begin
rollback
end

böylece tüm update işlemleriniz gerçekleşmiş olur. Eğer update sorgularınızdan biri, bir sebeple çalışmazsa, catch'e düşüp rollback çalışacağından, o sırada yapılan tüm update işlemleri iptal olur. Yine bir soru olursa, cevaplandırabilirim.

Bayram Ali dedi ki...

Teşekkür ediyorum.