Oracle With As Kullanımı

Oracle Sql İyileştirme / En İyi Pratik (Oracle Sql Tunning / Best Practice)

Oracle Sql ile çalışırken örnek şöyle bir ihtiyacımız olsun:

t_islem (islem_no, islem_tarihi, islem_tutari, islem_tipi_no)
t_islem_tipi (islem_tipi_no, islem_tipi_tanim, islem_tipi_olusturulma_tarihi)

Yukarıdaki iki tablo gibi tablolarımız olsun, t_islem tablosu da günlük ya da aylık partion lı (içindeki veriye göre parçalı, bölünmüş) çok sayıda kayıt içeren bir tablo olsun. Amacımız da dönemlik toplamların yanına yıllık toplamları getirmek olsun.

Geleneksel çözüm:

select t1.yil_ay,
t1.islem_tipi_tanim,
t1.tutar as yil_ay_tutar,
t2.tutar as yil_tutar
from
(
    select to_number(to_char(t_islem.islem_tarihi,'YYYYMM')) as yil_ay,
    t_islem_tipi.islem_tipi_tanim,
    sum(islem_tutari) as tutar
    from t_islem,
    t_islem_tipi
    where t_islem.islem_tipi_no = t_islem_tipi.islem_tipi_no
    group by to_number(to_char(t_islem.islem_tarihi,'YYYYMM')),
    t_islem_tipi.islem_tipi_tanim
) t1,
(
    select to_number(to_char(t_islem.islem_tarihi,'YYYY')) as yil,
    t_islem_tipi.islem_tipi_tanim,
    sum(islem_tutari) as tutar
    from t_islem,
    t_islem_tipi
    where t_islem.islem_tipi_no = t_islem_tipi.islem_tipi_no
    group by to_number(to_char(t_islem.islem_tarihi,'YYYY')),
    t_islem_tipi.islem_tipi_tanim
) t2
where trunc(t1.yil_ay/100) = t2.yil
and t1.islem_tipi_tanim = t2.islem_tipi_tanim

With As ile geçici tablo (kaynak yeterliliğine göre çoğunlukla bellekte) oluşturularak ve daha az kod ile:

with t1 as (
    select to_number(to_char(t_islem.islem_tarihi,'YYYYMM')) as yil_ay,
    t_islem_tipi.islem_tipi_tanim,
    sum(islem_tutari) as tutar
    from t_islem,
    t_islem_tipi
    where t_islem.islem_tipi_no = t_islem_tipi.islem_tipi_no
    group by to_number(to_char(t_islem.islem_tarihi,'YYYYMM')),
    t_islem_tipi.islem_tipi_tanim
)
select t1.yil_ay,
t1.islem_tipi_tanim,
t1.tutar as yil_ay_tutar,
t2.tutar as yil_tutar
from t1,
(
    select trunc(yil_ay/100) as yil,
    islem_tipi_tanim,
    sum(tutar) as tutar
    from t1
    group by trunc(yil_ay/100),
    islem_tipi_tanim
) t2
where trunc(t1.yil_ay/100) = t2.yil
and t1.islem_tipi_tanim = t2.islem_tipi_tanim

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir