COMMON TABLE EXPRESSION (ORTAK TABLO IFADELERI)
SQL Server veritabanında farklı tablolarda bulunan bir çok bilgiye sıklıkla ihtiyaç duyarız ve çoğu zaman bu işlem sadece birkaç tablodan veri alınarak çözümlenemeyebilir. Çoğu kez farklı tablolarda bulunan bilgi topluluklarının birbiriyle karşılaştırılması gibi karmaşık işler yapmak durumunda kalabiliriz.
Bu nedenle SQL Server tablolar ile çalışmamız yanında bize görüntüler(view),geçici (temp) tablolar gibi çözümler sunmuştur. (Tablolar ile çalışmamız aslen doğru da değildir. Çünkü burda yapılacak bir yanlışlık uygulama veya raporlama gibi işlemlerimizi sekteye uğratabilir.)
Ancak bu çözümlerin yanında SQL Server bize Ortak Tablo İfadeleri (Common Table Expression) dediğimiz bir çözümde sunar ki oldukça pratiktir.
Aklımıza bahsettiğimiz çözümlerin hepsinin işimizi gördüğü dolayısıyla herhangi birinin kullanılmasının doğru olucağı akla gelebilir bu kısmen doğrudur ancak çözümlere tek tek baktığımızda;
- Görüntülerin veritabanında kod olarak erişilebilir olarak bulunduğunu ve genel olarak tekrar olarak veritabanında tutulması istenilmeyen büyük veri kümelerinin saklanması için kullanılmasının uygun olduğunu söylemekte yarar var. Bir başka deyişle birden fazla tabloda bulunan verilerin birleştirilerek bir tabloda tutulmasından ziyade bunun görüntü olarak tutulması daha anlamlıdır. (Görüntüler yerine prosedürlerde (stored procedure) kullanılabilir.Durum onlar içinde geçerlidir.)
- Geçici tablolar ise adı üzerinde tablolara yaptığımız sorguların sonuçlarını bir kenara yazılması ve kullanılması mantığı ile çalışır. Sorguların okunabilirliği zor olmak ile beraber geçici tabloların düşürülmesi (drop) beklenir. Gerçek tablolardan farklı olarak "#" ifadesi ile ayrışırlar okunmaları zorlaşır.
Ortak Tablo İfadelerimiz ise görüntüler gibi karmaşık işlemler gerçekleştirMEyeceğimiz durumlarda , iş bittikten sonra ortadan kaldırılmasını istediğimiz sorguların yönetilebildiği okunabirliliği son derece yüksek çözümlerdir.
Aynı zamanda Ortak Tablo ifadeler ile özyineli (recursive) çağrılarda yapabilmekteyiz.
Uygulamamıza bakalım;
USE [DatabaseTest]
GO
/****** Object: Table [dbo].[t_urunler] Script Date: 03/13/2012 21:01:03 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[t_urunler](
[id] [int] NULL,
[urun] [varchar](50) NULL,
[ust_id] [int] NULL
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
scripti kullanarak tablomuzu oluşturalım.
INSERT [dbo].[t_urunler] ([id], [urun], [ust_id]) VALUES (1, N'Meyve', 0)
INSERT [dbo].[t_urunler] ([id], [urun], [ust_id]) VALUES (2, N'Sebze', 0)
INSERT [dbo].[t_urunler] ([id], [urun], [ust_id]) VALUES (3, N'Elektronik_esya', 0)
INSERT [dbo].[t_urunler] ([id], [urun], [ust_id]) VALUES (4, N'Elma', 1)
INSERT [dbo].[t_urunler] ([id], [urun], [ust_id]) VALUES (5, N'Amasya Elma', 4)
INSERT [dbo].[t_urunler] ([id], [urun], [ust_id]) VALUES (6, N'Salatalik', 2)
INSERT [dbo].[t_urunler] ([id], [urun], [ust_id]) VALUES (7, N'MP3 Player', 3)
INSERT [dbo].[t_urunler] ([id], [urun], [ust_id]) VALUES (8, N'Domates', 2)
INSERT [dbo].[t_urunler] ([id], [urun], [ust_id]) VALUES (9, N'Adana Salatalik', 6)
INSERT [dbo].[t_urunler] ([id], [urun], [ust_id]) VALUES (10, N'TV', 3)
INSERT [dbo].[t_urunler] ([id], [urun], [ust_id]) VALUES (11, N'LCD TV', 10)
INSERT [dbo].[t_urunler] ([id], [urun], [ust_id]) VALUES (12, N'Armut', 1)
INSERT [dbo].[t_urunler] ([id], [urun], [ust_id]) VALUES (13, N'Pirasa', 2)
INSERT [dbo].[t_urunler] ([id], [urun], [ust_id]) VALUES (14, N'Muz', 1)
INSERT [dbo].[t_urunler] ([id], [urun], [ust_id]) VALUES (15, N'Cikita Muz', 14)
INSERT [dbo].[t_urunler] ([id], [urun], [ust_id]) VALUES (16, N'Kok', null)
Basit CTE örneği ;
with Test_Urunler (id,urun,ust_id)
as
(
Select * from t_urunler
)
Select * from Test_Urunler
Özyineleme örneği:
with Test_Urunler (id,urun,ust_id,katman)
as
(
Select *,1 as katman from t_urunler where ust_id is null
union all
select urunler.*,katman + 1 as katman from t_urunler urunler inner join Test_Urunler test_urunler on
test_urunler.id = urunler.ust_id
)
Select * from Test_Urunler order by katman,ust_id
Bu nedenle SQL Server tablolar ile çalışmamız yanında bize görüntüler(view),geçici (temp) tablolar gibi çözümler sunmuştur. (Tablolar ile çalışmamız aslen doğru da değildir. Çünkü burda yapılacak bir yanlışlık uygulama veya raporlama gibi işlemlerimizi sekteye uğratabilir.)
Ancak bu çözümlerin yanında SQL Server bize Ortak Tablo İfadeleri (Common Table Expression) dediğimiz bir çözümde sunar ki oldukça pratiktir.
Aklımıza bahsettiğimiz çözümlerin hepsinin işimizi gördüğü dolayısıyla herhangi birinin kullanılmasının doğru olucağı akla gelebilir bu kısmen doğrudur ancak çözümlere tek tek baktığımızda;
- Görüntülerin veritabanında kod olarak erişilebilir olarak bulunduğunu ve genel olarak tekrar olarak veritabanında tutulması istenilmeyen büyük veri kümelerinin saklanması için kullanılmasının uygun olduğunu söylemekte yarar var. Bir başka deyişle birden fazla tabloda bulunan verilerin birleştirilerek bir tabloda tutulmasından ziyade bunun görüntü olarak tutulması daha anlamlıdır. (Görüntüler yerine prosedürlerde (stored procedure) kullanılabilir.Durum onlar içinde geçerlidir.)
- Geçici tablolar ise adı üzerinde tablolara yaptığımız sorguların sonuçlarını bir kenara yazılması ve kullanılması mantığı ile çalışır. Sorguların okunabilirliği zor olmak ile beraber geçici tabloların düşürülmesi (drop) beklenir. Gerçek tablolardan farklı olarak "#" ifadesi ile ayrışırlar okunmaları zorlaşır.
Ortak Tablo İfadelerimiz ise görüntüler gibi karmaşık işlemler gerçekleştirMEyeceğimiz durumlarda , iş bittikten sonra ortadan kaldırılmasını istediğimiz sorguların yönetilebildiği okunabirliliği son derece yüksek çözümlerdir.
Aynı zamanda Ortak Tablo ifadeler ile özyineli (recursive) çağrılarda yapabilmekteyiz.
Uygulamamıza bakalım;
USE [DatabaseTest]
GO
/****** Object: Table [dbo].[t_urunler] Script Date: 03/13/2012 21:01:03 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[t_urunler](
[id] [int] NULL,
[urun] [varchar](50) NULL,
[ust_id] [int] NULL
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
scripti kullanarak tablomuzu oluşturalım.
INSERT [dbo].[t_urunler] ([id], [urun], [ust_id]) VALUES (1, N'Meyve', 0)
INSERT [dbo].[t_urunler] ([id], [urun], [ust_id]) VALUES (2, N'Sebze', 0)
INSERT [dbo].[t_urunler] ([id], [urun], [ust_id]) VALUES (3, N'Elektronik_esya', 0)
INSERT [dbo].[t_urunler] ([id], [urun], [ust_id]) VALUES (4, N'Elma', 1)
INSERT [dbo].[t_urunler] ([id], [urun], [ust_id]) VALUES (5, N'Amasya Elma', 4)
INSERT [dbo].[t_urunler] ([id], [urun], [ust_id]) VALUES (6, N'Salatalik', 2)
INSERT [dbo].[t_urunler] ([id], [urun], [ust_id]) VALUES (7, N'MP3 Player', 3)
INSERT [dbo].[t_urunler] ([id], [urun], [ust_id]) VALUES (8, N'Domates', 2)
INSERT [dbo].[t_urunler] ([id], [urun], [ust_id]) VALUES (9, N'Adana Salatalik', 6)
INSERT [dbo].[t_urunler] ([id], [urun], [ust_id]) VALUES (10, N'TV', 3)
INSERT [dbo].[t_urunler] ([id], [urun], [ust_id]) VALUES (11, N'LCD TV', 10)
INSERT [dbo].[t_urunler] ([id], [urun], [ust_id]) VALUES (12, N'Armut', 1)
INSERT [dbo].[t_urunler] ([id], [urun], [ust_id]) VALUES (13, N'Pirasa', 2)
INSERT [dbo].[t_urunler] ([id], [urun], [ust_id]) VALUES (14, N'Muz', 1)
INSERT [dbo].[t_urunler] ([id], [urun], [ust_id]) VALUES (15, N'Cikita Muz', 14)
INSERT [dbo].[t_urunler] ([id], [urun], [ust_id]) VALUES (16, N'Kok', null)
Basit CTE örneği ;
with Test_Urunler (id,urun,ust_id)
as
(
Select * from t_urunler
)
Select * from Test_Urunler
Özyineleme örneği:
with Test_Urunler (id,urun,ust_id,katman)
as
(
Select *,1 as katman from t_urunler where ust_id is null
union all
select urunler.*,katman + 1 as katman from t_urunler urunler inner join Test_Urunler test_urunler on
test_urunler.id = urunler.ust_id
)
Select * from Test_Urunler order by katman,ust_id
Yorumlar
Yorum Gönder