SQL Server’da İlişkili Tablolarda DISTINCT Kullanmadan Yinelenen Değerleri Kaldırmak

SQL Server'da İlişkili Tablolarda DISTINCT Kullanmadan Yinelenen Değerleri Kaldırmak
SQL Server'da İlişkili Tablolarda DISTINCT Kullanmadan Yinelenen Değerleri Kaldırmak

Herkese merhaba. Bu yazıda SQL Server’da ilişkili tablolarda DISTINCT kullanmadan yinelenen değerleri kaldırmak ile ilgili bilgi vermeye çalışacağım.

SQL Server’da verilerle çalıştığınızda, bazen veri girişleri nedeniyle değil, aynı zamanda T-SQL sorgularıyla da yinelenen veriler elde etme olasılıkları vardır. Çoğumuz DISTINCT anahtar sözcüğünü kullanır. DISTINCT kullanmak iyidir, bu yinelenen satırları kaldıracaktır. Ancak bazı durumlarda DISTINCT sorgu performansını iyileştirmez. Sorgu, yürütme için daha fazla zaman harcar ve daha fazla veriye sahipsek bu daha fazla zaman olacaktır.

ROW_NUMBER() kullanarak, sonuç kümesindeki yinelenen değerleri kaldırabiliriz. ROW_NUMBER(), sorgunun sonuç kümesindeki her satıra sıralı bir tamsayı numarası atayan bir fonksiyondur.

Aşağıda konuyla ilgili bir örnek görmektesiniz.

-- Bolumler tablosunu olusturma
CREATE TABLE Bolumler (
    BolumID INT PRIMARY KEY,
    BolumAdi VARCHAR(50)
);

-- Calisanlar tablosunu olusturma
CREATE TABLE Calisanlar (
    CalisanID INT PRIMARY KEY,
    Ad VARCHAR(50),
    Soyad VARCHAR(50),
    BolumID INT,
    FOREIGN KEY (BolumID) REFERENCES Bolumler(BolumID)
);

-- Bolumler tablosuna ornek veri ekleme
INSERT INTO Bolumler (BolumID, BolumAdi)
VALUES (1, 'Satış'),
       (2, 'Pazarlama'),
       (3, 'Finans');

-- Calisanlar tablosuna ornek veri ekleme
INSERT INTO Calisanlar (CalisanID, Ad, Soyad, BolumID)
VALUES (1, 'Ahmet', 'Yılmaz', 1),
       (2, 'Ayşe', 'Demir', 2),
       (3, 'Mehmet', 'Kaya', 3),
	   (9, 'Ahmet', 'Yılmaz', 1),
       (4, 'Elif', 'Öztürk', 1),
       (5, 'Ali', 'Şahin', 2),
       (6, 'Fatma', 'Arslan', 3),
	   (7, 'Ayşe', 'Demir', 2),
	   (8, 'Ahmet', 'Yılmaz', 1),
	   (10, 'Mehmet', 'Kaya', 3)

--Sorgu
       
WITH CTE AS (
    SELECT AltSorgu.CalisanID
		  ,AltSorgu.Ad
		  ,AltSorgu.Soyad
		  ,AltSorgu.BolumAdi
          ,ROW_NUMBER() OVER (PARTITION BY AltSorgu.Ad,AltSorgu.Soyad ORDER BY AltSorgu.CalisanID) AS rn
    FROM (
        SELECT t1.CalisanID
			  ,t1.Ad
			  ,t1.Soyad
			  ,t2.BolumAdi
        FROM Calisanlar t1
        INNER  JOIN Bolumler t2 ON t1.BolumID = t2.BolumID
    ) AS AltSorgu
)
SELECT CalisanID
	  ,Ad
	  ,Soyad
	  ,BolumAdi
	  ,rn
FROM CTE
WHERE rn = 1
ORDER BY CalisanID ASC

Yukarıdaki kodu çalıştırınca aşağıdakine benzer bir sonuç göreceksiniz.

Görüldüğü üzere ilişkili tablolarda yinelenen satırlar kaldırılmış oldu.

Başka bir seçenek de, GROUP BY ifadesini kullanarak yinelenen değerleri kaldırmaktır. GROUP BY deyimi, aynı değerlere sahip satırları özet satırları halinde gruplandırır.

SELECT t1.Ad,
       t1.Soyad,
       t2.BolumAdi
FROM Calisanlar t1
    INNER JOIN Bolumler t2
        ON t1.BolumID = t2.BolumID
GROUP BY t1.Ad,
         t1.Soyad,
         t2.BolumAdi;

Yukarıdaki kodu çalıştırınca aşağıdakine benzer bir sonuç göreceksiniz.

Görüldüğü üzere ilişkili tablolarda yinelenen satırlar tekrar kaldırılmış oldu.

Herkese çalışma hayatında ve yaşamında başarılar kolaylıklar.

211 Kez Okundu

Yavuz Selim Kart

Yazılım ve veri tabanında bildiklerimi anlatmaya gayret ediyorum. Halen birçok programlama dili üzerinde araştırmalar yaparak kendimi geliştiriyorum. Bunlar haricinde Grafik Tasarım ve Wordpress konularına da ilgim bulunmakta. SEO ve Sosyal medya yönetimleri hakkında da bilgim mevcuttur. Kısaca çok çalışmayı seven azimli biriyim.

You may also like...

Yazı kopyalamak yasaktır!