sorgulama kısaltma

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
zalimsevki
Üye
Mesajlar: 38
Kayıt: 02 Ara 2005 07:36
Konum: Denizli

sorgulama kısaltma

Mesaj gönderen zalimsevki »

Bir After Ypdate triggerinde

SET CELL_01 = (SELECT SUM (CELL_01)
FROM SE_FORM023
WHERE (SE_FORM023.CALISMA_YILI = @XCALISMA_YILI) AND
(SE_FORM023.CALISMA_AYI = @XCALISMA_AYI) AND
(SE_FORM023.SAGLIKOCAGI_ID = @XSAGLIKOCAGI_ID))
SET CELL_02 = ...
böyle bir Update çok sayıda alan için (cell_01, cell_02.....)yapılacak ve koşul kısmı hepsindede aynı olacak
WHERE (SE_FORM023.CALISMA_YILI = @XCALISMA_YILI) AND
(SE_FORM023.CALISMA_AYI = @XCALISMA_AYI) AND
(SE_FORM023.SAGLIKOCAGI_ID = @XSAGLIKOCAGI_ID))
koşul kısmını kısaltmak için koşulu değişkenlere atayarak denedim olmadı .. @XCALISMA_YILI, @XCALISMA_AYI, @XSAGLIKOCAGI_ID değişkelnleri (deleted) tablosundan elde ettiğim değişkenler ..
nasıl bi yol izlemeliyim .. forum camiasına selamlar
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Mesaj gönderen rsimsek »

Şöyle yapılabilir;

Kod: Tümünü seç

UPDATE TABLO
SET CELL_01, CELL_02, CELL_03,.. = 
  (SELECT SUM(CELL_01), SUM(CELL_02), SUM(CELL_03), ...
   FROM SE_FORM023
   WHERE (SE_FORM023.CALISMA_YILI = @XCALISMA_YILI) 
     AND (SE_FORM023.CALISMA_AYI = @XCALISMA_AYI) 
     AND (SE_FORM023.SAGLIKOCAGI_ID = @XSAGLIKOCAGI_ID))
Bu arada izninizle kodu biraz düzenledim, benim için kodun okunabilirliği doğruluğundan önde gelir. Okunabilirliği yükseldikçe hatayı saklama özelliği azalır :wink:

Dikkatimi çeken UPDATE edilecek tabloda tüm kayıtlardaki CELL alanları mı değiştirilecek :?: Yoksa herhangi bir koşul koymamışsınız :?: :idea:
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
zalimsevki
Üye
Mesajlar: 38
Kayıt: 02 Ara 2005 07:36
Konum: Denizli

Mesaj gönderen zalimsevki »

Veridiğiniz şekilde trigger hata verdi, hocam .. Benim yapmak istediğim aynı yapıdaki 5-10 adet tabloyu Tek bir toplam tablosunda birleştirmekti .. Bu toplama işleminide her update olayında toplamların Toplam tablosuna yazılması şeklinde yapmak istiyordum .. Updatenin şartı aşağıdaydı onu koymamıştım ..
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Mesaj gönderen rsimsek »

TRIGGER de kullanırken :old (önceki değer) ve :new (yeni değer) olaylarına dikkat etmek gerekir :idea: Ayrıca HATA nın bir adı olmalı :idea:
En önemlisi bir Update Triggerinde aynı tabloya UPDATE yapılamaz :!:
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
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,

Recep, M$-SQL Server'da :OLD yada :NEW diye değişkenler yok ki, neye dikkat etsin :) Onun yerine CURSOR açıp DELETED ve INSERTED tablolarından kayıt çekerek yapması lazım bazı işlemlerini.

Ayrıca M$-SQL Server'ın tetiklenme mekanizması sadece AFTER'da vardır ve hem BULK (Multi Row) hem de tek kayıtta sadece bir defa tetiklenir.

Bu göz önünde bulundurulması gerekir.
Kuri Yalnız Jedi
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
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,

Ben istediğinizi tam olarak anlayamadım. Bir daha farklı bir biçimde izah eder misiniz?

Yapılmak istenen şey nedir, ayrıca yazdığınız SQL'leri tam olarak yazarsanız hedefte elde etmek istediğiniz şeyi oluşturabiliriz sanırım.

Kolay Gelsin
Kuri Yalnız Jedi
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Mesaj gönderen rsimsek »

Hocam ben de sadece olaya dikkat çekmek için standart sql ile ilgili benzetme yaptım. Doğrusu sql-server kullanmıyorum. Aynı tabloya kayıt yapılıyorsa dikkat çekmek istedim. Bir de olay dediğin gibi çok ortadan alınmış tam anlaşılamıyor :?
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
Hakan Can
Üye
Mesajlar: 634
Kayıt: 04 Mar 2005 04:27
Konum: Ankara

Mesaj gönderen Hakan Can »

Benzer şartı içeren birden fazla alanı tek şart belirterek UPDATE etmek için şuna benzer bir yol izleyebilirsiniz.

Şu kod uzun şekli:

Kod: Tümünü seç

UPDATE ACILMIS_SARF
SET
HARCAMA_TUTARI=HARCAMA_MIKTARI*(SELECT DIGER_CIKIS_TUTARI/DIGER_CIKIS_MIKTARI
FROM SUS
WHERE (SUS.BUTCE_KODU=61)
 AND (ACILMIS_SARF.CINS = SUS.URUN_KODU)
 AND (ACILMIS_SARF.YIL = SUS.YIL)
 AND (SUS.DIGER_CIKIS_MIKTARI > 0)
 AND (ACILMIS_SARF.AY = SUS.AY)
)
, S_HARCAMA_TUTARI=HARCAMA_MIKTARI*(SELECT S_DIGER_CIKIS_TUTARI/DIGER_CIKIS_MIKTARI
FROM SUS
WHERE (SUS.BUTCE_KODU=61)
 AND (ACILMIS_SARF.CINS = SUS.URUN_KODU)
 AND (ACILMIS_SARF.YIL = SUS.YIL)
 AND (SUS.DIGER_CIKIS_MIKTARI > 0)
 AND (ACILMIS_SARF.AY = SUS.AY)
)
WHERE EXISTS
 (SELECT * FROM SUS
WHERE (SUS.BUTCE_KODU=61)
 AND (ACILMIS_SARF.CINS = SUS.URUN_KODU)
 AND (ACILMIS_SARF.YIL = SUS.YIL)
 AND (SUS.DIGER_CIKIS_MIKTARI > 0)
 AND (ACILMIS_SARF.AY = SUS.AY)
)
AND (ACILMIS_SARF.BUTCE_KODU = 61)
Şu kod ise şartın teke indirilmiş hali:

Kod: Tümünü seç

UPDATE ACILMIS_SARF SET
  HARCAMA_TUTARI   = T1.HARCAMA_MIKTARI * T2.DIGER_CIKIS_TUTARI   / T2.DIGER_CIKIS_MIKTARI,
  S_HARCAMA_TUTARI = T1.HARCAMA_MIKTARI * T2.S_DIGER_CIKIS_TUTARI / T2.DIGER_CIKIS_MIKTARI
FROM ACILMIS_SARF T1
  INNER JOIN SUS T2 ON T2.BUTCE_KODU = T1.BUTCE_KODU AND T2.URUN_KODU = T1.CINS AND T2.YIL = T1.YIL AND T2.AY = T1.AY
WHERE T1.BUTCE_KODU = 61 AND T2.BUTCE_KODU = 61 AND T2.DIGER_CIKIS_MIKTARI > 0
İkinci kod hem daha sade hem de daha hızlı sonuçlanmakta. Alan sayısı arttığında bu daha da bariz belli olacaktır.
Cevapla