Konuyu Oyla:
  • Derecelendirme: 5/5 - 1 oy
  • 1
  • 2
  • 3
  • 4
  • 5
SQL Self Join Yöntemi Hakkında
#1
Selamlar


Self Join işlemleri aynı tabloyu tekrar kullanılarak ikinci bir tabloymuş gibi işlem yapmak için kullanılır diye biliyordum
Fakar aşağıdaki örneği inceleyince işin böyle olmadığını düşündüm.
Bu nasıl oluyorda aynı tablo self join yapılıpta farklı IDleri olan diye bir koşul verilebiliyor.
Yoksa gözden kaçırdığım bir yermi var sorguda

Aşağıdaki adreste verilen örnekteki yapıyı şematik olarak anlatabilecek varmıdır?
https://www.w3schools.com/sql/sql_join_self.asp

Teşekkürler
Bu dünyada kendine sakladığın bilgi ahirette işine yaramaz. 
Cevapla
#2
Selam,
Tabloyu kendisi ile ilişkilendirmek için kullanılan bir komuttur.
Örnekte şehirleri aynı olup id leri farklı olan kayıtları şehire göre dizip birbiri ile ilişkilendiriyor.
Olayı şöyle düşünün.

a,b,c şeklinde kayıtlarımız olsun, biz ab, ac, ba, bc, ca, cc şeklinde 2li gruplar çekicez tablodan, işte burada Self Join işin içine giriyor. Bu kayıtların primary birer id si olucak tabi, işte burda id leri birbirinden farklı verirseniz aa, bb ve cc şeklinde kayıtlar gösterilmeyecektir.

Umarım anlatabilmişimdir.
WWW
Cevapla
#3
@esistem  hocam güzel anlatmışsınız teşekkürler
peki aşağıdaki ikinci yapı ile birinci yapı arasında sizce bir fark varmı
her ikisininde sonucu aynı fakat büyük datalarda acaba süre farkı oluşurmu

Linkteki Örnek 
SELECT A.CustomerName AS CustomerName1, B.CustomerName AS CustomerName2, A.City
FROM Customers A, Customers B
WHERE A.CustomerID <> B.CustomerID
AND A.City = B.City 
ORDER BY A.City

bu durumda aşağıdaki ile aynı işi yapar doğrumudur
SELECT A.CustomerName AS CustomerName1, B.CustomerName AS CustomerName2, A.City
FROM Customers A
    inner join (Select * from Customers) B on A.City = B.City
WHERE A.CustomerID <> B.CustomerID
ORDER BY A.City;
Bu dünyada kendine sakladığın bilgi ahirette işine yaramaz. 
Cevapla
#4
Evet aynı işi yapacaktır. Süre farkı bence olurmu olmazmı bilemiyorum ama, onu konuda uzman arkadaşlar daha iyi bilirler.
WWW
Cevapla
#5
Veri setlerini çarprazlamak için genel olarak JOIN kullanılıyor. İsteyen joinsiz de eşitleyebilir fakat önerilen yolun dışın çıkmamak genellikle iyidir. Yani JOIN'siz join işlemi yapmayın derim. Ayrıca indeks de gerekir.

Yeterince zeki olan veritabanı sistemlerinin her iki kullanımı aynı şekilde yorumlaması mümkün. Genellikle "Profiler" veya "Analyzer" adını verdikleri dahili yardımcı araçlarla bir sorgunun derinlemesine nasıl çalıştığını veya sistemde tam olarak neler olup bittiğini ince detayına kadar görebiliriz. SQL Server ve diğerlerinde bu tür araçlar mevcuttu.
Cevapla
#6
(19-07-2018, Saat: 18:09)adelphiforumz Adlı Kullanıcıdan Alıntı: @esistem  hocam güzel anlatmışsınız teşekkürler
peki aşağıdaki ikinci yapı ile birinci yapı arasında sizce bir fark varmı
her ikisininde sonucu aynı fakat büyük datalarda acaba süre farkı oluşurmu

Linkteki Örnek 
SELECT A.CustomerName AS CustomerName1, B.CustomerName AS CustomerName2, A.City
FROM Customers A, Customers B
WHERE A.CustomerID <> B.CustomerID
AND A.City = B.City 
ORDER BY A.City

bu durumda aşağıdaki ile aynı işi yapar doğrumudur
SELECT A.CustomerName AS CustomerName1, B.CustomerName AS CustomerName2, A.City
FROM Customers A
    inner join (Select * from Customers) B on A.City = B.City
WHERE A.CustomerID <> B.CustomerID
ORDER BY A.City;

Merhabalar.

Aslında Yukarıdaki SQL cümlelerinin her ikiside aynı cevabı verecektir ama

SELECT A.CustomerName AS CustomerName1, B.CustomerName AS CustomerName2, A.City
FROM Customers A
JOIN Customers B ON a.City = B.City
WHERE A.CustomerID <> B.CustomerID
ORDER BY A.City;

Şeklinde yazarak Süre olayını ortada kaldırırsınız.
Customer Tablosunun tamamını Çekip JOIN yapmak burada şu sıkıntıya yol açacaktır
SQL de işlemler alttan üste doğru gittiği için ilk başta Customeri 1 kez FULL çekecek buradaki veriye göre bu süreyi bekleyeceksiniz
Daha Sonrasında JOIN işlemi yaptıktan sonra yine Customer tablosu ile bir select işlemi olacak ve yine o süreyi beklemiş olacaksınız.
Joın işleminde Direk tabloyu Joinleyip size lazım olan kısmı joinde verirseniz süre olarak daha kısa sürelerde olacaktır.

Eğer veri çok fazla ise buna farklı çözümlerde bulunur.

Örneğin

CREATE TABLE #Customer (
   CustomerID INT 
  ,CustomerName1 VARCHAR(150)
  ,CustomerName2 VARCHAR(150)
  )
INSERT INTO #Customer (CustomerID,CustomerName1)
SELECT CustomerID,CustomerName1 FROM Customers 

UPDATE #Customer Set CustomerName2 = (Select CustomerName From Customers A WHERE A.CustomerID <> #Customer.CustomerID)

Select * From #Customer
Drop Table #Customer

Şeklinde daha Hızlı Sonuç Elde edeceksiniz.
İnşallah Faydalı Olabilmişimdir.
Cevapla
#7
Firebird ile az önce denedim cari hesap tablomda, 1. yöntem 31 ms sürdü 2. yöntem 14 ms sürdü, 1.5M kayıttan fazla verdi.
Kısaca, @ssahinoglu nun dediği gibi Join kullanılması iyiymiş.
WWW
Cevapla
#8
Fikir paylaşan herkese teşekkürler
Bu dünyada kendine sakladığın bilgi ahirette işine yaramaz. 
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  triger hakkında basit bir soru. Bay_Y 8 3.061 17-08-2023, Saat: 20:05
Son Yorum: Tuğrul HELVACI
  DBNETLIB Hatası hakkında adelphiforumz 5 3.032 02-06-2023, Saat: 14:18
Son Yorum: Misc-2
  MSSQl üzerinde çalışan bir sorgunun durumu hakkında bilgi almak. Bay_Y 5 3.752 21-09-2021, Saat: 11:26
Son Yorum: Bay_Y
  En yakın değeri bulmak hakkında adelphiforumz 8 6.127 25-02-2021, Saat: 22:53
Son Yorum: adelphiforumz
  ADOConnection Timeout Problemi hakkında adelphiforumz 3 3.862 02-12-2020, Saat: 09:03
Son Yorum: esistem



Konuyu Okuyanlar: 1 Ziyaretçi