Bu SQL deyiminde çift iç birleştirmenin kullanılmasının nedeni nedir?


10

Bu eski SQL sorgusu bakıyorum. Ben elde edemiyorum biraz neden aynı tabloları aynı sütunlarda iki kez katılıyor iç. Ben Table1 ve Table1 "Table1Alias" takma adı ile katıldı,

SELECT DISTINCT othercolumns,
                Table1Alias.columna
FROM   maintable
       INNER JOIN secondarytable
               ON maintable.id1 = secondarytable.a_id1
       INNER JOIN table1
               ON secondarytable.id2 = table1.id3
       INNER JOIN table1 Table1Alias
               ON secondarytable.id2 = Table1Alias.id3
       INNER JOIN thirdtable
               ON table1.id4 = thirdtable.id5
       INNER JOIN fourthtable
               ON thirdtable.id6 = fourthtable.id7
       INNER JOIN fivetable
               ON thirdtable.id8 = fivetable.id9
       INNER JOIN sixthtable
               ON Table1Alias.columna = sixthtable.id10
       LEFT JOIN seventhtable
              ON thirdtable.id11 = seventhtable.id12
WHERE  LEFT(secondarytable.type123, 2) BETWEEN '01' AND '09'
       AND secondarytable.type456 = 'cate'
       AND table1.type = '0'
       AND Table1Alias.columna = 'conn'

Yanıtlar:


27

Sorguyu bu şekilde yeniden yazmak yardımcı olabilir, bu nedenle 2 birleşimin farklı olduğu açıktır , yani birleşimler farklı alt kümelere (aynı tablonun) aittir:

FROM   maintable 
       INNER JOIN secondarytable 
               ON maintable.id1 = secondarytable.a_id1 
       INNER JOIN table1 
               ON secondarytable.id2 = table1.id3 
              AND table1.type = '0' 
       INNER JOIN table1 Table1Alias 
               ON secondarytable.id2 = Table1Alias.id3 
              AND Table1Alias.columna = 'conn' 
       INNER JOIN
       ...
WHERE  LEFT(secondarytable.type123, 2) BETWEEN '01' AND '09' 
       AND secondarytable.type456 = 'cate' 

birleşimler SONRASI uygulanacak NEREDE değildir, yani bu kısıtlamaların join deyiminin bir parçası olup olmadığı, yani bir AND ile bağlı olup olmadığına katılıyorum, ancak tüm deneyimdeki WHERE, gelen satırları filtrelemenin sonucuna uygulanır birleştirilmiş tablo, gerçek birleştirmeyi etkilemez.
Frank Hopkins

3
@Darkwing Bildiğim kadarıyla, nereye koyduğunuz önemli değil, çünkü en iyi istisna planını bulmak için sorgu optimizasyonunun işi. Ancak onları daha okunabilir hale getirdikleri için birleştirmelerin yanına koymak daha iyidir, ancak bu sadece bir
Mathematics

Katılma SONRASI gerçekleşse bile, sonuçların birleşimi farklıdır. Ve evet, birleştirilen satırlar genellikle performansı artırdığı için katılmadan önce filtrelenir.
Gherman

1
Ayrıca, bir alt sorguyla katılmaya eşdeğerdir, örn INNER JOIN (SELECT * FROM table1 WHERE type = 0) table1. Bu, olanları daha da belirgin hale getirebilir.
Barmar

3
@Matematik - bir koşulun ONbirleştirme yan tümcesinde mi yoksa yan WHEREtümcesinde mi olduğu, katılmanın an OUTER JOIN. Koşulda bir koşul başarısız olursa ON, birincil satır yine de dahil edilir (eşleşen bir dış satır olmadan); WHEREyan tümcesinde başarısız olursa , birincil satır sonuç kümesinin dışında bırakılır.
RDFozz

8

Cümleye bakıldığında where, ile işaretlenen satırın table1sütunu type= '0' ve işaret ettiği satırın table1aliassütununun columna= 'conn' olmasını gerektirir .

Belki table1aynı için birden fazla satır var id3?


2

Tablo yapısını görmeden - yaklaşım, daha küçük bir örtme dışı dizin kullanmak ve daha sonra bir 'Anahtar Arama' işleminden kaçınmak ve mevcut dizinleri değiştirmekten kaçınmak için satırların geri kalanını almak için daha büyük bir kaplama dizinindeki tabloya katılmak olabilir. (veya dizinleri değiştiremiyorsanız)


2

Bir tablo karmaşık bir birleşimde birden çok kez göründüğünde, bunun nedeni genellikle birden fazla ilişkiye katılan bir varlık olmasıdır. @Ypercube'un verdiği cevaba bakarak bu durum böyle görünüyor.

Varlıklar ve ilişkiler genellikle verinin anlambilimi ve temelde yatan konuyla bağlantı yoluyla anlaşılır. Eski sisteminiz dikkatle oluşturulduysa, muhtemelen konuyu analiz etmeye ve veri öğelerinin her birini dikkatlice tanımlamaya özen gösterdiler. Hatta bir Varlık-İlişki modeli oluşturmuş olabilirler. Tüm bu dikkatli çalışmalar kaybolmuş olabilir ve geçmişe doğru kazarak yeniden inşa edersiniz. Bu biraz arkeoloji gibi.

Table1 gibi tablo adlarıyla, konunuzun nasıl çalıştığı hakkında bir fikrimiz yok. İsimler açıklayıcı olsa bile, sisteminizin konusunu anlamamız sizin durumunuzda gerekenden çok farklı olabilir. Bu size bağlı olacak.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.