it-swarm.com.de

CROSS JOIN vs INNER JOIN in SQL Server 2008

Was ist der Unterschied zwischen CROSS JOIN und INNER JOIN?

CROSS JOIN:

SELECT 
    Movies.CustomerID, Movies.Movie, Customers.Age, 
    Customers.Gender, Customers.[Education Level], 
    Customers.[Internet Connection], Customers.[Marital Status], 
FROM   
    Customers 
CROSS JOIN 
    Movies

INNER JOIN:

SELECT 
    Movies.CustomerID, Movies.Movie, Customers.Age, 
    Customers.Gender, Customers.[Education Level], 
    Customers.[Internet Connection], Customers.[Marital Status]
FROM   
    Customers 
INNER JOIN 
    Movies ON Customers.CustomerID = Movies.CustomerID

Welches ist besser und warum sollte ich eines von beiden verwenden?

130
PriceCheaperton

Cross Join kombiniert die Zeilen nicht. Wenn Sie 100 Zeilen in jeder Tabelle mit 1 zu 1 Übereinstimmung haben, erhalten Sie 10.000 Ergebnisse. InnerJoin gibt nur 100 Zeilen in der gleichen Situation zurück.

Diese 2 Beispiele geben das gleiche Ergebnis zurück:

Cross Join

select * from table1 cross join table2 where table1.id = table2.fk_id

Innerer Join

select * from table1 join table2 on table1.id = table2.fk_id

Wenden Sie die letzte Methode an

105
t-clausen.dk

Hier ist das beste Beispiel für Cross Join und Inner Join.

Betrachten Sie die folgenden Tabellen

TABELLE: Teacher

x------------------------x
| TchrId   | TeacherName | 
x----------|-------------x
|    T1    |    Mary     |
|    T2    |    Jim      |
x------------------------x

TABELLE: Student

x--------------------------------------x
|  StudId  |    TchrId   | StudentName | 
x----------|-------------|-------------x            
|    S1    |     T1      |    Vineeth  |
|    S2    |     T1      |    Unni     |
x--------------------------------------x

1. INNER JOIN

Innerer Join wählt die Zeilen aus, die beide Tabellen erfüllen .

Bedenken Sie, dass wir die Lehrer, die Klassenlehrer sind, und ihre entsprechenden Schüler finden müssen. In diesem Fall müssen wir JOIN oder INNER JOIN Anwenden und werden es tun

enter image description here

Abfrage

SELECT T.TchrId,T.TeacherName,S.StudentName 
FROM #Teacher T
INNER JOIN #Student S ON T.TchrId = S.TchrId

Ergebnis

x--------------------------------------x
|  TchrId  | TeacherName | StudentName | 
x----------|-------------|-------------x            
|    T1    |     Mary    |    Vineeth  |
|    T1    |     Mary    |    Unni     |
x--------------------------------------x

2. CROSS JOIN

Cross Join wählt alle Zeilen aus der ersten Tabelle und alle Zeilen aus der zweiten Tabelle aus und zeigt als kartesisches Produkt dh mit allen Möglichkeiten

Bedenken Sie, dass wir alle Lehrer in der Schule und Schüler finden müssen, unabhängig von den Klassenlehrern, wir müssen CROSS JOIN Anwenden.

enter image description here

Abfrage

SELECT T.TchrId,T.TeacherName,S.StudentName 
FROM #Teacher T
CROSS JOIN #Student S 

Ergebnis

x--------------------------------------x
|  TchrId  | TeacherName | StudentName | 
x----------|-------------|-------------x            
|    T2    |     Jim     |    Vineeth  |
|    T2    |     Jim     |    Unni     |
|    T1    |     Mary    |    Vineeth  |
|    T1    |     Mary    |    Unni     |
x--------------------------------------x
172
Sarath Avanavu

CROSS JOIN = (INNER) JOIN = Komma (",")

TL; DR Der einzige Unterschied zwischen SQL CROSS JOIN, (INNER) JOIN und Komma (",") (außer Komma mit niedrigerer Priorität für die Auswertungsreihenfolge) ist, dass (INNER) JOIN ein ON hat, während CROSS JOIN und Komma nicht.


Zu Zwischenprodukten

Alle drei erzeugen ein relationales "kartesisches" Zwischenprodukt im SQL-Stil, auch bekannt als Cross-Join, aller möglichen Kombinationen einer Zeile aus jeder Tabelle. Es ist ON und/oder WHERE, die die Anzahl der Zeilen reduzieren. SQL Fiddle

Der SQL-Standard definiert <Komma> über Produkt (7.5 1.b.ii), <Cross Join> über <Komma> (7.7 1.a) und JOIN ON <Suchbedingung> über <Komma> plus WO (7.7 1.b).

Wie Wikipedia es ausdrückt:

Cross Join

CROSS JOIN gibt das kartesische Produkt von Zeilen aus Tabellen im Join zurück. Mit anderen Worten, es werden Zeilen erzeugt, die jede Zeile aus der ersten Tabelle mit jeder Zeile aus der zweiten Tabelle kombinieren.

Innerer Join

[...] Das Ergebnis des Joins kann als das Ergebnis definiert werden, dass zuerst das kartesische Produkt (oder der Cross-Join) aller Datensätze in den Tabellen genommen (jeder Datensatz in Tabelle A mit jedem Datensatz in Tabelle B kombiniert) und dann zurückgegeben wird alle Datensätze, die das Join-Prädikat erfüllen.

Die "implizite Verknüpfungsnotation" listet einfach die zu verbindenden Tabellen in der FROM-Klausel der SELECT-Anweisung mit Kommas auf, um sie zu trennen. Es gibt also einen Cross-Join an

Zu [~ # ~] äußeren [~ # ~] JOINs und der Verwendung von ON vs WHERE in ihnen siehe Bedingungen in LEFT JOIN (OUTER JOIN) vs INNER JOIN .

Warum Spalten zwischen Tabellen vergleichen?

Wenn es keine doppelten Zeilen gibt:

Jede Tabelle enthält die Zeilen, die eine echte Aussage aus einer bestimmten Anweisungsvorlage zum Ausfüllen der Leerzeichen machen. (Es macht einen wahren Satz aus - erfüllt - ein bestimmtes (charakteristisches) Prädikat .)

  • Eine Basistabelle enthält die Zeilen, die aus einer vom DBA vorgegebenen Anweisungsvorlage eine echte Aussage machen:

    /* rows where
    customer C.CustomerID has age C.Age and ...
    */
    FROM Customers C
    
  • Das Zwischenprodukt eines Joins enthält die Zeilen, die eine echte Aussage aus dem AND der Vorlagen seiner Operanden machen:

    /* 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-Bedingungen werden UND-verknüpft, um eine weitere Vorlage zu erhalten. Der Wert entspricht wieder den Zeilen, die diese Vorlage erfüllen:

    /* 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
    

Insbesondere bedeutet der Vergleich von Spalten auf (SQL-) Gleichheit zwischen Tabellen, dass die Zeilen, die vom Produkt aus den Teilen der Vorlage mit verknüpften Tabellen ferngehalten werden, für diese Spalten denselben Wert (ungleich NULL) aufweisen. Es ist nur ein Zufall, dass viele Zeilen in der Regel durch Gleichheitsvergleiche zwischen Tabellen entfernt werden - was notwendig und ausreichend ist, ist die Charakterisierung der gewünschten Zeilen.

Schreiben Sie einfach SQL für die Vorlage für die gewünschten Zeilen!

Zur Bedeutung von Abfragen (und Tabellen gegenüber Bedingungen) siehe:
So erhalten Sie übereinstimmende Daten aus einer anderen SQL-Tabelle für zwei verschiedene Spalten: Inner Join und/oder Union?
Gibt es eine Faustregel, um eine SQL-Abfrage aus einer für Menschen lesbaren Beschreibung zu erstellen?

Überladen von "Cross Join"

Leider wird der Begriff "Cross Join" verwendet für:

  • Das Zwischenprodukt.
  • CROSS JOIN.
  • (INNER) JOIN mit einem ON oder WHERE, das keine Spalten einer Tabelle mit Spalten einer anderen vergleicht. (Da dies dazu neigt, so viele Zwischenproduktzeilen zurückzugeben.)

Diese verschiedenen Bedeutungen werden verwechselt. (ZB wie in anderen Antworten und Kommentaren hier.)

Verwenden von CROSS JOIN vs (INNER) JOIN vs Komma

Die gemeinsame Konvention lautet:

  • Verwenden Sie CROSS JOIN nur dann, wenn Sie keine Spalten zwischen Tabellen vergleichen. Das soll zeigen, dass der Mangel an Vergleichen beabsichtigt war.
  • Verwenden Sie (INNER) JOIN mit ON, wenn und nur wenn Sie Spalten zwischen Tabellen vergleichen. (Plus möglicherweise andere Bedingungen.)
  • Verwenden Sie kein Komma.

Typischerweise werden auch Bedingungen, die nicht auf Tabellenpaaren stehen, für ein WHERE gespeichert. Möglicherweise müssen sie jedoch in einem (n INNEREN) JOIN ON abgelegt werden, um die entsprechenden Zeilen für das Argument eines RECHTEN, LINKEN oder VOLLEN (ÄUSSEREN) JOINS zu erhalten.

Zu "Kein Komma verwenden" Das Mischen von Komma mit explizitem JOIN kann irreführen, da Komma eine niedrigere Priorität hat. Angesichts der Rolle des Zwischenprodukts im Sinne von CROSS JOIN, (INNER) JOIN und Komma sind die Argumente für die obige Konvention, es überhaupt nicht zu verwenden, jedoch verwackelt. Ein CROSS JOIN oder ein Komma ist wie ein (INNER) JOIN, der eine WAHRE Bedingung erfüllt. Ein Zwischenprodukt, ON und WHERE, führen im entsprechenden Prädikat ein UND ein. Es kann jedoch auch daran gedacht werden, INNER JOIN ON - beispielsweise nur dann zu generieren, wenn ein Paar von Eingabezeilen gefunden wird, die die ON-Bedingung erfüllen - die Cross-Join-Zeilen zurückzugeben, die die Bedingung erfüllen. Der einzige Grund, warum ON hatte, um das Komma in SQL zu ergänzen, war das Schreiben [~ # ~] äußerer [~ # ~] JOINs. Natürlich sollte ein Ausdruck seine Bedeutung klar machen; Aber was klar ist, hängt davon ab, was unter Dingen zu verstehen ist.

Re-Venn-Diagramme Ein Venn-Diagramm mit zwei sich überschneidenden Kreisen kann den Unterschied zwischen Ausgabezeilen für INNER, LEFT, RIGHT & FULL JOINs für dieselbe Eingabe. Und wenn ON unbedingt TRUE ist, ist das Ergebnis INNER JOIN dasselbe wie CROSS JOIN. Es kann auch die Eingabe- und Ausgabezeilen für INTERSECT, UNION & EXCEPT darstellen. Wenn beide Eingaben die gleichen Spalten haben, ist das INTERSECT-Ergebnis dasselbe wie für Standard-SQL NATURAL JOIN, und das EXCEPT-Ergebnis ist dasselbe wie für bestimmte Idiome, die LEFT & RIGHT JOIN betreffen. Aber es zeigt nicht , wie (INNER) JOIN im Allgemeinen funktioniert. Das erscheint nur auf den ersten Blick plausibel . Es kann Teile der Eingabe und/oder Ausgabe für Sonderfälle von ON, PKs (Primärschlüssel), FKs (Fremdschlüssel) und/oder identifizieren WÄHLEN. Um dies zu erkennen, müssen Sie lediglich die Elemente der Mengen identifizieren , die durch die Kreise dargestellt werden. (Welche durcheinandergebrachten Präsentationen niemals klar machen.) (Denken Sie daran, dass für Joins Ausgabezeilen im Allgemeinen andere Überschriften haben als Eingabezeilen . Und SQL-Tabellen sind Taschen not setzt von Zeilen mit NULL .)

63
philipxy

Inner Join

Der Join, bei dem nur die Zeilen angezeigt werden, die in beiden verknüpften Tabellen übereinstimmen, wird als innerer Join bezeichnet. Dies ist die Standardverknüpfung im Abfrage- und Ansichts-Designer.

Syntax für Inner Join

SELECT t1.column_name,t2.column_name
FROM table_name1 t1
INNER JOIN table_name2 t2
ON t1.column_name=t2.column_name

Cross Join

Ein Cross-Join, der ein kartesisches Produkt der an dem Join beteiligten Tabellen erzeugt. Die Größe eines kartesischen Produkts ist die Anzahl der Zeilen in der ersten Tabelle multipliziert mit der Anzahl der Zeilen in der zweiten Tabelle.

Syntax für Cross Join

SELECT * FROM table_name1
CROSS JOIN table_name2

Oder wir können es auch anders schreiben

SELECT * FROM table_name1,table_name2

Überprüfen Sie nun die Abfrage unten für Cross Join

Beispiel

SELECT * FROM UserDetails
CROSS JOIN OrderDetails

Oder

SELECT * FROM UserDetails, OrderDetails
23
kavitha Reddy

Denken Sie daran, wenn eine WHERE-Klausel hinzugefügt wird, verhält sich der Cross-Join wie ein Inner-Join. Die folgenden Transact-SQL-Abfragen führen beispielsweise zu derselben Ergebnismenge. Weitere Informationen finden Sie unter http://technet.Microsoft.com/en-us/library/ms190690 (v = sql.105) .aspx

9
user3095896

SQL Server akzeptiert auch die einfachere Notation von:

SELECT A.F, 
       B.G, 
       C.H 
  FROM TABLE_A A, 
       TABLE_B B, 
       TABLE_C C
 WHERE A.X = B.X 
   AND B.Y = C.Y

Mit dieser einfacheren Schreibweise braucht man sich nicht um den Unterschied zwischen Innen- und Kreuzverbindungen zu kümmern. Anstelle von zwei "ON" -Klauseln gibt es eine einzige "WHERE" -Klausel, die die Arbeit erledigt. Wenn Sie Schwierigkeiten haben, herauszufinden, welche "JOIN" - "ON" -Klauseln wohin führen, lassen Sie die "JOIN" -Notation los und verwenden Sie die einfachere oben.

Es betrügt nicht.

6
David F Mayer

Cross-Join und Inner-Join sind identisch, mit dem einzigen Unterschied, dass beim Inner-Join einige Ergebnisse des kartesischen Produkts boolesch gefiltert werden

table1
x--------------------------------------x
|  fieldA  |    fieldB   |    fieldC   | 
x----------|-------------|-------------x            
|    A     |      B      |    option1  |
|    A     |      B1     |    option2  |
x--------------------------------------x

table2
x--------------------------------------x
|  fieldA  |    fieldB   |    fieldC   | 
x----------|-------------|-------------x            
|    A     |      B      |    optionB1 |
|    A1    |      B1     |    optionB2 |
x--------------------------------------x

 cross join
  A,B,option1,A,B,optionB1
  A,B,option1,A1,B1,optionB2
  A,B1,option2,A,B,optionB1
  A,B1,option2,A1,B1,optionB2

 inner join on field1 (only with the value is the same in both tables)
  A,B,option1,A,B,optionB1
  A,B1,option2,A,B,optionB1

 inner join on field1
  A,B,option1,A,B,optionB1

Bei der Gestaltung unserer Daten entscheiden wir, dass es nur einen Fall für das Feld gibt, das wir für den Join verwenden. Verbinden Sie nur Kreuzverknüpfungen beider Tabellen und rufen Sie nur die Zeilen ab, die einen speziellen booleschen Ausdruck ausführen.

Beachten Sie, dass wenn die Felder, für die wir unsere Joins ausführen, in beiden Tabellen null sind, wir den Filter passieren würden. Es liegt an uns oder dem Datenbankhersteller, zusätzliche Regeln hinzuzufügen, um Nullen zu vermeiden oder zuzulassen. Das Festhalten an den Grundlagen ist nur ein Cross-Join, gefolgt von einem Filter.

2
Javier Bañez

Beim Schreiben von Abfragen unter Verwendung von Inner-Joins werden die Datensätze aus beiden Tabellen abgerufen, wenn die Bedingung für beide Tabellen erfüllt ist, d. H. Die exakte Übereinstimmung der gemeinsamen Spalte in beiden Tabellen.

Beim Schreiben von Abfragen mit Cross-Join ist das Ergebnis wie ein kartesisches Produkt der Anzahl der Datensätze in beiden Tabellen. Beispiel: Wenn Tabelle1 2 Datensätze enthält und Tabelle2 3 Datensätze enthält, lautet das Ergebnis der Abfrage 2 * 3 = 6 Datensätze.

Entscheide dich also nicht für Cross-Join, bis du das brauchst.

2
Jagadeesh G

Die innere Verknüpfung gibt das Ergebnis übereinstimmender Datensätze zwischen zwei Tabellen an, wobei die Kreuzverknüpfung die möglichen Kombinationen zwischen zwei Tabellen ergibt.

0
sindhu