DISTINCT Komutu

4. Ocak 2014 18:46 by Admin in SQL Server  //  Tags: ,   //   Yorumlar (0)

Sql'de bir tablodan veya ilişkili tablolardan Select komutu ile çektiğimiz veriler içinde birbirinin aynı veriler bulunabilir. Aynı verilerin birden fazla satırda tekrarladığı zamanlarda listeleme esnasında bir kez yazılması (tekrarsız sonuçlar) elde etmek için kullanılır.

 

Örneğin Nebim Winner veritabanında stok kartlarımızda tema kodu boş olan modelleri listelemek istediğimizde her bir modelin renklerinin bedenleri için içinde model kodu ve renk kodunu, bedenleri için tekrarlayacağını düşünürsek ve bedenleri çekmeden listemizi almaya kalkarsak bize birbini tekrarlayan çok fazla sayıda satır verecektir. Fakat distinct komutu ile bunun önüne geçe biliriz.

 

Örnek kod = [sourcecode language="sql"] SELECT DISTINCT tbStok.sModel, tbStok.sAciklama ,tbStok.sModel ,tbStok.sRenk,tbRenk.sRenkAdi,IsNuLL((tbModelRenkTema.sTemaKodu),'') as [Tema Kodu] ,IsNuLL((tbTema.sAciklama),'') as TemaAciklama

FROM tbAsorti, tbStok left outer join tbstokresim on tbstok.smodel=tbstokresim.smodel left outer join tbStokAciklama on tbStok.nStokID=tbStokAciklama.nStokID left outer join tbModelRenkTema on tbModelRenkTema.sModel = tbStok.sModel and tbModelRenkTema.sRenk = tbStok.sRenk left outer join tbTema on tbTema.sTemaKodu = tbModelRenkTema.sTemaKodu ,tbStokTipi,tbFiyatlandirma,tbRenk

WHERE tbStokTipi.nStokTipi=tbStok.nStokTipi and tbStok.sDefaultAsortiTipi = tbAsorti.sAsortiTipi and  tbStok.nFiyatlandirma=tbFiyatlandirma.nFiyatlandirma  and tbRenk.sRenk=tbStok.sRenk and (tbStok.nStokTipi=1 or tbStok.nStokTipi=2 or tbStok.nStokTipi=3) and  tbModelRenkTema.sTemaKodu IS null

ORDER BY tbStok.sModel ,tbStok.sRenk 

 

Şeklinde yazınca oluyor. Bu kod sonucu Model ait Renkleri tekil olduğu için tekrar eden verilerden kurtulmuş oluyoruz.

 

SQL Server 2008 R2’de Generate Script

Merhaba Arkadaşlar;
Bu makalemizde SQL Server 2008 R2'de Generate Script özelliğinden bahsetmek istiyorum.
Bilindiği gibi SQL serverda aldığımız yedekleri geriye dönük olarak restore edemiyoruz. Yani 2008 üstünde aldığımız bir yedeği 2005 veya 2000e restore edemiyorduk. Hatta 2008 R2den 2008e bile restore yapılamıyor. Çünkü hepsi birbirinden farklı versiyonlar.
Fakat Generate Script özelliği ile veritabanımızı (buna veriler da dahil)  T-SQL komutlarına çevirip, diğer versiyonlar üstünde çalıştırabilir hale getirebiliyoruz.
Haydi yapalım;

SQL Server Management Studio üstünde Scriptini almak istediğimiz Veritabanının (Databese)  üstüne sağ tıklayıpTasklarden, Generate Script diyoruz. Ben AdventureWorks veritabanı üstünden gidiceğim. Benim Serverim 2008 R2 ve 2005'e aktarım yapacağım.

 Bu ekranda karşımıza iki seçenek çıkıyor .

  1. “Script entire database and all database objects”  tüm veritabanı ve veritabanı nesneleri için mi?
  2. “Select specific database objects” belirli veritabanı nesneleri için mi?

Scprit oluşturmak istediğimizi seçiyoruz. Ben veritabanımın tümünü yedek alacağım için 1 seçeneği işaretli bırakarak Next diyorum.

 

 Bu ekranda Scriptin nasıl kullanmak istediğimizi soruyor.

  1. “Save Scripts to a specific location”  Scripti kaydetmek sitediğimiz yeri ve nasıl kayedetmek isteğimizi soran bir panel
  2. “Publish to Web Service” Eğer istersek bir web service ile yayınlaya bilceğimiz bir panel  ekranımıza geliyor.

 Ben Script'i kaydedeceğim için 1. Seçenek ile devam ediyorum panelde

  1.  Save to file seçersek; Scripti bir T-SQL dosyasına export eder.
  1. Single file; seçilir ise tek bir dosya olarak export eder.
  2. Single file per object; seçilir ise her nesneyi (table, view, vb) ayrı dosyalara export eder.
  3. File name:  dosyayı nereye ve adının ne olacağını belirliyoruz.
  1. Save to Clipboard; seçersek sanki ctrl + c ile bir yazıyı kopyalamış gibi olur herhangi bir yere notepad, ya da Word, Query sayfasına yapıştırıp kullanabiliriz.
  1. Save to new query window; seçilirse Scripti yeni bir query ekranına yazar.

Tam bir yedek alacağım ve farklı bir versiyona dosyayı vereceğim için  advance butonuna tıkladım. Buradaki parametreler önemli. Hepsini tek tek anlatmayacağım ama ilk etapta önemli olanların üstünden geçelim.

Script for Server Version: Bu seçenek ile hangi versiyona Script hazırlıyorsak onu seçebiliriz. Ben SQL 2005 için hazırlayacağım .
Scripts Login: Bu seçenek ile veritabanında ki kullanıcıları da taşıyıp taşımayacağımız ayarlıyoruz. Ben taşımayacağım için False olarak bırakıyorum.
Type of data to Script: Bu bölümde 3 farklı seçenek çıkıyor karşımıza
  1. Schema only; sadece veritabanını ve objelerini (table,view vb.) oluşturabileceğimiz içinde her hangibir verinin taşınmadığı bir script hazırlar.
  2. Schema and data; veritabanının şemasını ve tüm verilerimizin taşınmasını sağlayan bir scritp hazırlar,
  3. Data only; adından da anlaşıldığı gibi sadece verilerimizi şeması aynı olan bir veritabanına eklememizi sağlayacak bir script hazırlar,

Ben  Schema  and datayı seçiyorum. Yani hem şemalar hem de veriler taşınacak.
Yine aşağıdan gerekli olabilecek seçenekleri True olarak işaretleyip yada istemediklerimiz False edip Scripte dahil edebilir veya çıkartabiliriz.
Next dedikten sonra seçeneklerimiz kontrol edebileceğimiz bir özet ekranı geliyor. Kontrol ettikten sonra. Next diyoruz ve Script oluşturulmaya başlıyor.

Script oluşturma başarılı oldu. Şimdi de bunu 2005e import edelim.
Scripte çift tıklıyorum ve management studioyoda açıp çalıştıracaktım. Fakat şöyle bir hata ile karşılaştım.
Bunun sebebi query dosyasının yaklaşık 500 MB olması zaten neredeyse hiç bir text editörde bu dosyayı açamiyor.

Bizde bu işlemi command promtu kullanarak yapacağız. cmd yi açıp şu satırı yazıyorum.

osql -S [servername] -U [username] -P [password] -i [Dosya yolu]
osql -S test\SQL2005 -U sa -P ****** -i c:\adventure.sql
ve Veritabanı oluşturulmaya başlıyor. Bu işlem büyük veritabanlarında uzun sürebiliyor.
Ve görüldüğü gibi gibi 2008 R2den 2005e yani geriye dönük veritabanını taşımış olduk.
Yalnız şunuda belirtmeliyim ki Script yöntemini büyük veritabanlarında sağlıklı bulunmuyor. Tam olarak Scripte güvenip iş yapmanızı tavsiye etmem. Ama zor durumlarda hızır gibide yetişir.
Umarım faydalı olur.
Kolay gelsin.