CROSS JOIN = (INNER) JOIN = virgül (",")
TL; DR SQL CROSS JOIN, (INNER) JOIN ve virgül (",") arasındaki tek fark (değerlendirme sırası için daha düşük önceliğe sahip virgülün yanı sıra) CROSS JOIN ve virgül içermezken (INNER) JOIN bir ON'a sahiptir.
Yeniden ara ürünler
Her üçü de, her bir tablodan bir satırın tüm olası kombinasyonlarından bir ara kavramsal SQL tarzı ilişkisel "Kartezyen" ürünü, yani çapraz birleştirme üretir. Sıra sayısını azaltan AÇIK ve / veya NEREDE.SQL Keman
SQL Standart tanımlar <comma> ürünüyle (7.5 1.b.ii), <çapraz katılma> <comma> (7.7 1.a) ile ve JOIN ON <arama koşulu> ile <comma> artı WHERE (7.7 1.b) üzerinden ).
Wikipedia'nın belirttiği gibi:
Çapraz katılma
CROSS JOIN birleşimdeki tablolardan satırların Kartezyen ürününü döndürür. Başka bir deyişle, ilk tablodaki her satırı ikinci tablodaki her bir satırla birleştiren satırlar üretecektir.
İç birleşim
[...] Birleşmenin sonucu, ilk olarak tablolardaki tüm kayıtların Kartezyen ürününü (veya Çapraz birleştirmeyi) (tablo A'daki her kaydı tablo B'deki her kayıtla birleştirerek) ve sonra geri döndürmenin sonucu olarak tanımlanabilir. birleştirme yüklemini tatmin eden tüm kayıtlar.
"Örtülü birleştirme notasyonu", SELECT deyiminin FROM yan tümcesinde, ayırmak için virgül kullanarak birleştirme tablolarını listeler. Böylece çapraz bir birleşmeyi belirtir.
OUTER JOIN'ları yeniden kullanın ve ON ile WHERE arasındaki bağlantıları kullanma LEFT JOIN (OUTER JOIN) ile INNER JOIN .
Tablolar arasındaki sütunları neden karşılaştırmalı?
Yinelenen satır olmadığında:
Her tablo, belirli bir doldurma boşlukları ifade şablonundan gerçek bir ifade oluşturan satırları içerir. (Bu, gerçek bir hale teklif from-- karşılayan -a bazı (karakteristik) yüklemi .)
Temel tablo, bazı DBA tarafından verilen deyim şablonlarından gerçek bir deyim oluşturan satırları içerir:
/* rows where
customer C.CustomerID has age C.Age and ...
*/
FROM Customers C
Bir katılımın ara ürünü, işlenenlerinin şablonlarının AND'inden doğru bir ifade veren satırları içerir:
/* rows where
customer C.CustomerID has age C.Age and ...
AND movie M.Movie is rented by customer M.CustomerID and ...
*/
FROM Customers C CROSS JOIN Movies M
ON & WHERE koşulları VE daha fazla şablon vermek üzere yerleştirilir. Değer, yine bu şablonu karşılayan satırlardır:
/* rows where
customer C.CustomerID has age C.Age and ...
AND movie M.Movie is rented by customer M.CustomerID and ...
AND C.CustomerID = M.CustomerID
AND C.Age >= M.[Minimum Age]
AND C.Age = 18
*/
FROM Customers C INNER JOIN Movies M
ON C.CustomerID = M.CustomerID
AND C.Age >= M.[Minimum Age]
WHERE C.Age = 18
Özellikle, tablolar arasındaki (SQL) eşitliği için sütunların karşılaştırılması, şablondan birleştirilen tabloların bölümlerinden üründen tutulan satırların, bu sütunlar için aynı (NULL olmayan) değere sahip olduğu anlamına gelir. Birçok satırın tipik olarak tablolar arasındaki eşitlik karşılaştırmalarıyla kaldırılması tesadüfidir - gerekli ve yeterli olan, istediğiniz satırları karakterize etmektir.
İstediğiniz satırlar için şablon için SQL yazın!
Sorguların (ve tabloların koşullara karşı) anlamlarına bakın:
İki farklı sütun için başka bir SQL tablosundan eşleşen veriler nasıl alınır: İç Birleştirme ve / veya Birlik?
İnsan tarafından okunabilir bir açıklamadan SQL sorgusu oluşturmak için herhangi bir başparmak kuralı var mı?
Aşırı yükleme "çapraz birleştirme"
Ne yazık ki "çapraz katılma" terimi aşağıdakiler için kullanılır:
- Ara ürün.
- ÇAPRAZ KATIL.
- (INNER) Bir tablodaki herhangi bir sütunu başka bir sütunun herhangi bir sütunu ile karşılaştırmayan bir ON veya WHERE ile BİRLEŞİN (Bu, ara ürün satırlarının çoğunu döndürme eğiliminde olduğundan.)
Bu çeşitli anlamlar şaşkına döner. (Örneğin, diğer yanıtlar ve yorumlardaki gibi.)
CROSS JOIN vs (INNER) JOIN vs virgül kullanma
Ortak sözleşme:
- CROSS JOIN öğesini yalnızca ve tablolar arasındaki sütunları karşılaştırmadığınız zaman kullanın. Bu, karşılaştırma eksikliğinin kasıtlı olduğunu göstermek içindir.
- Tablolar arasındaki sütunları karşılaştırdığınızda (INNER) JOIN işlevini ON ile kullanın. (Artı muhtemelen diğer koşullar.)
- Virgül kullanmayın.
Tipik olarak, bir NERE için tablo çiftlerinde olmayan koşullar da tutulur. Ancak SAĞ, SOL veya TAM (DIŞ) BİRLEŞTİRME argümanı için uygun satırları almak için bir (n INNER) JOIN ON'a konmaları gerekebilir.
Re "Virgül kullanmayın" Virgülün önceliği daha düşük olduğundan virgülün açık JOIN ile karıştırılması yanıltıcı olabilir. Ancak CROSS JOIN, (INNER) JOIN ve virgül anlamında ara ürünün rolü göz önüne alındığında, yukarıdaki sözleşmenin hiç kullanılmaması argümanları titrek. ÇAPRAZ BİRLEŞTİRME veya virgül, tıpkı GERÇEK bir durumdaki (İÇ) BİRLEŞME gibidir. Bir ara ürün, ON ve WHERE hepsi karşılık gelen yüklemde bir AND ekler. Bununla birlikte, başka bir INNER JOIN ON düşünülebilir - örneğin, yalnızca ON koşulunu karşılayan bir çift giriş satırı bulurken bir çıkış satırı oluşturmak - yine de, koşulu karşılayan çapraz birleştirme satırlarını döndürür. AÇIK tek nedeni vardı SQL takviyesi virgül yazmaktı OUTERJOIN. Tabii ki, bir ifade anlamını netleştirmelidir; ama açık olan ne anlama geldiğine bağlıdır.
Re Venn diyagramları Kesişen iki daireye sahip bir Venn diyagramı , aynı giriş için INNER, LEFT, RIGHT & FULL JOIN'lar için çıkış satırları arasındaki farkı gösterebilir . ON, koşulsuz olarak DOĞRU olduğunda, INNER JOIN sonucu CROSS JOIN ile aynıdır. Ayrıca INTERSECT, UNION & EXCEPT için giriş ve çıkış satırlarını gösterebilir . Her iki giriş de aynı sütunlara sahip olduğunda, INTERSECT sonucu standart SQL NATURAL JOIN ile aynıdır ve EXCEPT sonucu LEFT & RIGHT JOIN içeren belirli deyimlerle aynıdır. Ama yok değil (İÇ) genel olarak eserlerini KATILIN nasıl göstermektedir. Bu ilk bakışta akla yatkın görünüyor . Parçaların giriş ve / veya çıkışözel durumlarını tanımlayabilirON, PKs (birincil anahtarlar), FKs (yabancı anahtarlar) ve / veya SELECT. Bunu görmek için tek yapmanız gereken , daireler tarafından temsil edilen kümelerin öğelerinin tam olarak ne olduğunu tanımlamaktır . (Hangi sunumlar açıkça asla başarılı oldular.) (Birleştirmeler için genelde unutmayın çıkış sıraları giriş satırları farklı başlıklar var . Ve SQL tablolardır çantalar değil setleri satır boş değerlere sahip .)
CROSS JOIN
tabloların tüm olası kombinasyonları ile sonuçlanacaktır. örneğin 100 sıralı Table1 ve 100 sıralı Table2 10000 kayıtla sonuçlanacaktır.