Geçtiğimiz günlerde yaptığımız bir entegrasyon sonrası bize gönderilen viewi joinleyerek kullanmamız gerekti. Ancak gelen view birçok tablodan data çektiği için birde viewi joinleyerek bir kaç kez kullanmak istediğimizde sorgunun dönüşü çok uzun zaman aldı. Bu sorunu T-SQL de sanal tablo oluşturarak sorunsuz bir şekilde aştık.
Geçici tabloları oluşturmak için de tıpkı normal bir tabloyu oluşturmakta kullandığımız “CREATE TABLE” ifadesini kullanırız. Ancak bu oluşturulan tablonun gerçek bir tablo mu yoksa geçici bir tablo mu olduğunun ayırt edilmesi gerekmektedir. Oluşturduğumuz tablonun sanal bir tablo olduğunu SQL e bildirmek için “#” işaretini kullanmamız gerekmektedir. CREATE TABLE ifadesinden sonra yazılan tablo isminin başına “#” işaretini eklediğimizde SQL bu tablonun geçici bir tablo olduğunu algılar ve oluşturulan tabloyu yalnızca ilgili oturum için geçerli kılar. Oturum kapatıldıktan sonra veya bir başka query ekranı açıldığında bu tabloya erişilemez.
Bir örnek üzerinden gitmek gerekirse:
SICIL | ADI SOYADI | ADRES | TELEFON | AMIRSICIL |
1 | EMRE KANBER | KÜTAHYA | 4537689 | NULL |
2 | ANIL GÜR | MANİSA | 9874532 | 1 |
3 | MUSTAFA ÇOBAN | ÇANAKKALE | 3427689 | 2 |
tablosunu kullanarak tabloyu sanal tabloya atıp onun üzerinde işlem yapacak bir sorgu oluşturalım. Yukarıdaki tablomuzun adı dbo.personel olsun. Yapamız gereken dbo.personel tablosunu bir temp tabloya atıp bu tabloyu kendisi ile joinleyerek kişilerin amirlerinin bilgilerine ulaşmak olsun.
Temp tabloyu oluşturmak için:
CREATE TABLE #personeltmp (
SICIL INT PRIMARY KEY,
ADISOYADI NVARCHAR(250),
ADRES NVARCHAR(250),
TELEFON NVARCHAR(250),
AMIRSICIL INT
)
sorgusunu kullanabiliriz. CREATE TABLE ifadesinden sonra başına “#” işaretini koyarak #personeltmp geçici tablomuzun adını verip parantezler içerisinde de tablomuzun kolonlarını tanımlayarak geçici tablomuzu oluşturmuş olduk.
INSERT INTO dbo.#personeltmp ( [SICIL], [ADISOYADI], [ADRES], [TELEFON], [AMIRSICIL] ) (SELECT * FROM dbo.personel)
sorgusu ile oluşturduğumuz temp tabloyu doldurmuş olduk. Bu işlem sonrasında dbo.personeltmp tablosunu istediğimiz sorgu içerisinde kullanabiliriz, ama yalnızca geçerili query için 🙂
SELECT
A.SICIL AS SICIL,
A.ADSOYAD AS ADSOYAD,
A.ADRES AS ADRES,
A.AMIRSICIL AS AMIRSICIL,
B.ADSOYAD AS AMIRADSOYAD,
B.ADRES AS AMIRADRES
FROM dbo.#personeltmp AS A LEFT JOIN dbo.#personeltmp AS B ON A.SICIL = B.AMIRSICIL
Örnek olarak yukarıdaki sorguyu Execute ettiğimizde bize dönecek olan sonuç şu şekilde olacaktır:
SICIL | ADSOYAD | ADRES | AMIRSICIL | AMIRADSOYAD | AMIRADRES |
1 | EMREKANBER | KÜTAHYA | NULL | NULL | NULL |
2 | ANILGÜR | MANİSA | 1 | EMREKANBER | KÜTAHYA |
3 | MUSTAFAÇOBAN | ÇANAKKALE | 2 | ANIL GÜR | MANİSA |
Belli bir sorguya göre kayıt nasıl ekleyebiliriz,? Mesela Adında Sadece a olanlar eklensin gibi. Teşekkürler
Aağıdaki şekilde bir sorgu örneği ile içerisinde a harfi olan isimleri temp tabloya ekleyebilirsiniz:
Create Table #tempTable
(
Name varchar(250)
)
insert into #tempTable
select ‘Mustafa’ AS Name
UNION
select ‘Betül’
UNION
select ‘Ahmet’
UNION
select ‘Cemil’
UNION
select ‘Canan’
select *
INTO #tempTable2
from #tempTable where Name Like ‘%a%’
select * from #tempTable2