CROSS JOIN vs INNER JOIN in SQL


150

Was ist der Unterschied zwischen CROSS JOINund 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 verwenden?


15
CROSS JOINführt zu allen möglichen Kombinationen der Tabellen. Beispiel: Tabelle1 mit 100 Zeilen und Tabelle2 mit 100 Zeilen führen zu 10000 Datensätzen.
Bummi

x CROSS JOIN yisx INNER JOIN y ON 1=1
philipxy

Antworten:


119

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 in derselben Situation nur 100 Zeilen zurück.

Diese beiden Beispiele liefern das gleiche Ergebnis:

Cross Join

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

Innere Verbindung

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

Verwenden Sie die letzte Methode


7
Und ich glaube, Sie können schreiben select * from table1 cross join table2 where table1.id = table2.fk_idals select * from table1, table2 where table1.id = table2.fk_id(durch cross joinein ersetzen ,)
Modulitos

5
@Lucas, das ist die alte Syntax für Joins, aber es wird funktionieren. Ich empfehle jedoch Clausens Version, die viel besser lesbar ist.
Iliketocode

1
Was meinst du mit 1 zu 1 Match? Was meinst du mit "gleiche Situation"
Jwan622

1
@iliketocode "alte Syntax für Joins" ist nicht klar, Sie sollten besser über SQL-
89-

Ihr INNER JOIN "100" ist ein Sonderfall, den Sie nicht erklärt und den allgemeinen Fall nicht erklärt haben.
Philipxy

186

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

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

Bedenken Sie, wir müssen die Lehrer finden, die Klassenlehrer sind, und ihre entsprechenden Schüler. In diesem Zustand müssen wir uns bewerben JOINoder INNER JOINund werden

Geben Sie hier die Bildbeschreibung ein

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 wird als kartesisches Produkt angezeigt, dh mit allen Möglichkeiten.

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

Geben Sie hier die Bildbeschreibung ein

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

1
Der Schlüssel von Abbildung 2 ist komplex: Er umgibt (Farbe irrelevant) Elemente eines Arguments von CROSS JOIN und eine Zahl (Wert irrelevant) ist eine Zeile davon und eine Linie (Farbe irrelevant) ist eine Ergebniszeile. Für Tabellen als Taschen ist es kein Venn-Diagramm: Für Zeilen als Werte ist es falsch ; Für Zeilen als Elemente können sie nicht freigegeben werden. Für Tabellen als Mengen benötigen Sie kein Venn-Diagramm. Abbildung 1 ist ein häufiger schrecklicher Versuch, JOIN zu erklären. Der Schlüssel ist ebenfalls komplex: Er gilt nur für Tabellen als Mengen und nur für Equijoin und nur für einen Wert. Es repräsentiert auch die Eingabe anders als die Ausgabe. Schreiben Sie es für JOIN im Allgemeinen.
Philipxy

Abbildung 1 ist nützlich und korrekt als erste von vier Färbungen von Venn-Diagrammen mit sich kreuzenden Kreisen für: (INNER) JOIN vs LEFT, RIGHT & FULL (OUTER) JOIN, aber nicht vs CROSS JOIN. Schnittzeilen befinden sich in JOIN, linke / rechte Zeilen sind zusätzliche (null-erweiterte) Zeilen in LEFT / RIGHT JOIN. Es enthält CROSS JOIN als Sonderfall von (INNER) JOIN, bei dem die Nichtkreuzung keine Zeilen enthält.
philipxy

1
Danke für Ihren Vorschlag. Wie auch immer, das OP hat nach dem Unterschied zwischen diesen beiden Verknüpfungen gefragt. Ich habe diese Frage so beantwortet, dass jeder Anfänger den Unterschied zwischen ihnen leicht verstehen kann. Wie Sie sagten, habe ich keine Schlüssel wie in einer Produktionsumgebung vergeben. Es ist nur ein Beispiel, das leicht zu verstehen ist. Und Cross Joindenken Sie, es werden nicht alle Zeilen zurückgegeben, wenn keine WhereKlausel angegeben ist? Aus Ihren Kommentaren geht hervor, dass ein Anfänger eher verwirrt sein kann !!! @phipipxy
Sarath Avanavu

1
Meine Kommentare weisen darauf hin, dass die Diagramme schwer zu interpretieren sind, selbst wenn man weiß, was sie zu sagen versuchen und für dieses Thema ungeeignet sind. Mit "Schlüssel" (in Abbildung 2 oder 1) meinte ich "Erklärung, was die Teile eines Diagramms bedeuten". Mit "schreibe es" meine ich, versuche selbst zu schreiben, was die Teile des Diagramms bedeuten. Sie werden feststellen, dass die Diagramme kompliziert sind und keine Kreuzverknüpfung oder innere Verknüpfung zeigen! Dh sie gehören nicht in deine Antwort. Relationale Schlüssel für PS-Tabellen spielen keine Rolle bei der Erklärung der Funktionsweise von JOINs. PPS Der einzige Unterschied zwischen den Joins besteht darin, dass INNER JOIN ein ON hat.
Philipxy

Schauen Sie in W3Schools w3schools.com/sql/sql_join_inner.asp nach, wo sie einen ähnlichen Diagrammtyp für INNER JOIN angegeben haben. Stellen Sie sicher, dass Sie Recht haben, bevor Sie Kommentare abgeben @philipxy
Sarath Avanavu

69

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

TL; DR Der einzige Unterschied zwischen SQL CROSS JOIN, (INNER) JOIN und Komma (",") (neben Komma mit niedrigerer Priorität für die Auswertungsreihenfolge) besteht darin, dass (INNER) JOIN ein ON hat, während CROSS JOIN und Komma dies nicht tun.


Zu Zwischenprodukten

Alle drei erzeugen ein relationales konzeptionelles relationales "kartesisches" Produkt 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 <comma> über Produkt (7.5 1.b.ii), <cross join> über <comma> (7.7 1.a) und JOIN ON <Suchbedingung> über <comma> plus WHERE (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.

Innere Verbindung

[...] Das Ergebnis des Joins kann als Ergebnis definiert werden, bei dem 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 Tabellen für die Verknüpfung in der FROM-Klausel der SELECT-Anweisung auf und verwendet Kommas, um sie zu trennen. Somit wird eine Querverbindung angegeben

Re OUTER JOIN und mit ON vs WHERE in ihnen sehen Bedingungen in LEFT JOIN (OUTER JOIN) vs INNER JOIN .

Warum Spalten zwischen Tabellen vergleichen?

Wenn keine doppelten Zeilen vorhanden sind:

Jede Tabelle enthält die Zeilen, die eine echte Aussage aus einer bestimmten Anweisungsvorlage zum Ausfüllen der [benannten] Lücken 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 angegebenen 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 wahre Aussage aus dem UND 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 sind wieder die 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 aus den Teilen der Vorlage der verknüpften Tabellen vom Produkt ferngehalten werden, für diese Spalten denselben Wert (nicht NULL) haben. Es ist nur ein Zufall, dass viele Zeilen normalerweise durch Gleichheitsvergleiche zwischen Tabellen entfernt werden. Notwendig und ausreichend 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 im Vergleich zu Bedingungen) siehe: Wie werden übereinstimmende Daten aus einer anderen SQL-Tabelle für zwei verschiedene Spalten abgerufen: Inner Join und / oder Union?
Gibt es eine Faustregel zum Erstellen einer SQL-Abfrage aus einer für Menschen lesbaren Beschreibung?

Überladen von "Cross Join"

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

  • Das Zwischenprodukt.
  • CROSS JOIN.
  • (INNER) VERBINDEN Sie mit einem ON oder WHERE, das keine Spalten aus einer Tabelle mit Spalten einer anderen vergleicht. (Da dies dazu neigt, so viele der 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 übliche Konvention lautet:

  • Verwenden Sie CROSS JOIN genau dann, wenn Sie keine Spalten zwischen Tabellen vergleichen. Das soll zeigen, dass das Fehlen von 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 liegen, für ein WHERE beibehalten. Möglicherweise müssen sie jedoch in einen (n INNER) JOIN ON gesetzt werden, um die entsprechenden Zeilen für das Argument für einen RIGHT, LEFT oder FULL (OUTER) JOIN zu erhalten.

Zu "Komma nicht 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 oben genannte Konvention, es überhaupt nicht zu verwenden, wackelig. Ein CROSS JOIN oder Komma ist wie ein (INNER) JOIN, der sich in einem WAHREN Zustand befindet. Ein Zwischenprodukt, ON und WHERE, führen alle ein UND in das entsprechende Prädikat ein. Ansonsten kann man sich INNER JOIN ON vorstellen - beispielsweise eine Ausgabezeile nur dann zu generieren, wenn ein Paar von Eingabezeilen gefunden wird, die die ON-Bedingung erfüllen - und dennoch die Cross-Join-Zeilen zurückgeben, die die Bedingung erfüllen. Der einzige Grund, warum ON das Komma in SQL ergänzen musste , war das Schreiben OUTERJOINs. Natürlich sollte ein Ausdruck seine Bedeutung klar machen; Aber was klar ist, hängt davon ab, was unter Dingen zu verstehen ist.

Zu Venn-Diagrammen Ein Venn-Diagramm mit zwei sich kreuzenden Kreisen kann den Unterschied zwischen Ausgabezeilen für INNER-, LEFT-, RIGHT- und FULL-JOINs für dieselbe Eingabe veranschaulichen. Und wenn das EIN bedingungslos WAHR ist, ist das INNER JOIN-Ergebnis dasselbe wie CROSS JOIN. Es kann auch die Eingabe- und Ausgabezeilen für INTERSECT, UNION & EXCEPT veranschaulichen. Wenn beide Eingaben dieselben Spalten haben, ist das INTERSECT-Ergebnis dasselbe wie für Standard-SQL-NATURAL-JOIN, und das EXCEPT-Ergebnis ist dasselbe wie für bestimmte Redewendungen, die LEFT & RIGHT-JOIN betreffen. Es zeigt jedoch nicht , wie (INNER) JOIN im Allgemeinen funktioniert. Das erscheint auf den ersten Blick nur plausibel . Es kann Teile der Eingabe und / oder Ausgabe für identifizierenSonderfälle von ON, PKs (Primärschlüssel), FKs (Fremdschlüssel) und / oder SELECT. Alles, was Sie tun müssen, um dies zu sehen, ist zu identifizieren, was genau die Elemente der Mengen sind, die durch die Kreise dargestellt werden . (Welche durcheinandergebrachten Präsentationen niemals klar machen.) (Denken Sie daran, dass Ausgabezeilen für Verknüpfungen im Allgemeinen andere Überschriften als Eingabezeilen haben . Und SQL-Tabellen sind Taschen, keine Sätze von Zeilen mit NULL-Werten .)


6
+1 Ich mag diese Antwort am besten - andere scheinen zu implizieren, dass die Ergebnisse unterschiedlich sein werden, aber wenn die "ON" -Klausel durch "WHERE" ersetzt wird, sind die Ergebnisse dieselben
Ronnie

4
+1 Vielen Dank, dass Sie geklärt haben, dass das Weglassen der ON-Klausel in einem INNER JOIN genau die gleichen Ergebnisse liefert wie die Verwendung des CROSS JOIN
Cerno

"Intermediate Conceptual SQL-artiges kartesisches Kreuzprodukt" - ist das eine andere Art zu sagen: "Es ist nicht wirklich eine Menge geordneter Paare, aber ich kann es nicht vermeiden," kartesisches Produkt "zu sagen"? :) Als Nicht-Mathematiker bin ich nur dann auf den Begriff "kartesisches Produkt" gestoßen, wenn jemand SQLs erklärt CROSS JOIN. Ich frage mich, wie oft jemand zu SQL kommt, der bereits mit dem kartesischen Produkt vertraut ist, es aber nicht herausfinden kann CROSS JOIN.
Tag, wenn

1
@onedaywhen Operator Das kartesische Produkt gibt bei bestimmten Sätzen einen Satz bestellter Tupel zurück. Das Ergebnis ist ein kartesisches Produkt. Relationale und SQL-Kulturen missbrauchen / überladen "kartesisches Produkt" leider für Operatoren, die evozieren, aber kein kartesisches Produkt sind. ZB Wikipedia! Ich bin dagegen - es führt nur in die Irre / verwirrt. Leider beschreibe ich hier nur unscharf, wie SQL Cross Join in meinen eigenen Worten funktioniert und verlasse mich auf Wikipedia. Ich beschrifte das Ergebnis „Zwischen konzeptuellem SQL-Stil cartesianischen Kreuzprodukt“. Ja, "Cartesian" ist für diejenigen, die leider bereits korrupt sind und es benutzen / erwarten.
Philipxy

1
Dies ist die richtige Antwort im Gegensatz zu höher bewerteten Antworten. Bei SQL ist es typisch, dass oberflächliche, vernünftig klingende, gut formatierte Erklärungen mit Bildern den Bildungsinhalt dominieren, obwohl sie nicht einmal die Grundlagen der Sprache verstehen oder definieren.
Charles Roddie

23

Inner Join

Der Join, der nur die Zeilen anzeigt, 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 Tabellen erzeugt, die an dem Join beteiligt sind. 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 folgende Abfrage auf Cross Join

Beispiel

SELECT * FROM UserDetails
CROSS JOIN OrderDetails

Oder

SELECT * FROM UserDetails, OrderDetails


8

CROSS JOIN

Wie ich in diesem Artikel erklärt habe , soll CROSS JOIN ein kartesisches Produkt erzeugen.

Ein kartesisches Produkt verwendet zwei Sätze A und B und generiert alle möglichen Permutationen von Paardatensätzen aus zwei gegebenen Datensätzen.

Angenommen, Sie haben die folgenden ranksund suitsDatenbanktabellen:

Die Reihen und Anzüge Tische

Und das rankshat folgende Zeilen:

| name  | symbol | rank_value |
|-------|--------|------------|
| Ace   | A      | 14         |
| King  | K      | 13         |
| Queen | Q      | 12         |
| Jack  | J      | 11         |
| Ten   | 10     | 10         |
| Nine  | 9      |  9         |

Während die suitsTabelle die folgenden Datensätze enthält:

| name    | symbol |
|---------|--------|
| Club    |       |
| Diamond |       |
| Heart   |       |
| Spade   |       |

Als CROSS JOIN-Abfrage wie folgt:

SELECT
   r.symbol AS card_rank,
   s.symbol AS card_suit
FROM
   ranks r
CROSS JOIN
   suits s

generiert alle möglichen Permutationen ranksund suitesPaare:

| card_rank | card_suit |
|-----------|-----------|
| A         |          |
| A         |          |
| A         |          |
| A         |          |
| K         |          |
| K         |          |
| K         |          |
| K         |          |
| Q         |          |
| Q         |          |
| Q         |          |
| Q         |          |
| J         |          |
| J         |          |
| J         |          |
| J         |          |
| 10        |          |
| 10        |          |
| 10        |          |
| 10        |          |
| 9         |          |
| 9         |          |
| 9         |          |
| 9         |          |

INNER JOIN

Andererseits gibt INNER JOIN das kartesische Produkt der beiden Verbindungsdatensätze nicht zurück.

Stattdessen nimmt der INNER JOIN alle Elemente aus der Tabelle auf der linken Seite und vergleicht sie mit den Datensätzen auf der Tabelle auf der rechten Seite, sodass:

  • Wenn in der Tabelle auf der rechten Seite kein Datensatz übereinstimmt, wird die Zeile auf der linken Seite aus der Ergebnismenge herausgefiltert
  • Für jeden übereinstimmenden Datensatz in der Tabelle auf der rechten Seite wird die Zeile auf der linken Seite wiederholt, als ob sich zwischen diesem Datensatz und allen zugehörigen untergeordneten Datensätzen in der Tabelle auf der rechten Seite ein kartesisches Produkt befand.

Angenommen, wir haben eine Eins-zu-Viele-Tabellenbeziehung zwischen einer übergeordneten postund einer post_commentuntergeordneten Tabelle , die wie folgt aussehen:

Eins-zu-viele-Tabellenbeziehung

Wenn die postTabelle nun die folgenden Datensätze enthält:

| id | title     |
|----|-----------|
| 1  | Java      |
| 2  | Hibernate |
| 3  | JPA       |

und die post_commentsTabelle hat diese Zeilen:

| id | review    | post_id |
|----|-----------|---------|
| 1  | Good      | 1       |
| 2  | Excellent | 1       |
| 3  | Awesome   | 2       |

Eine INNER JOIN-Abfrage wie die folgende:

SELECT
   p.id AS post_id,
   p.title AS post_title,
   pc.review  AS review
FROM post p
INNER JOIN post_comment pc ON pc.post_id = p.id

wird alle postDatensätze zusammen mit allen zugehörigen Datensätzen enthalten post_comments:

| post_id | post_title | review    |
|---------|------------|-----------|
| 1       | Java       | Good      |
| 1       | Java       | Excellent |
| 2       | Hibernate  | Awesome   |

Grundsätzlich können Sie sich INNER JOIN als gefilterten CROSS JOIN vorstellen, bei dem nur die übereinstimmenden Datensätze in der endgültigen Ergebnismenge gespeichert werden.

Weitere Informationen zur Funktionsweise von INNER JOIN finden Sie auch in diesem Artikel .


"INNER JOIN gibt das kartesische Produkt der beiden Verknüpfungsdatensätze nicht zurück" ist ein bisschen viel, wenn x INNER JOIN y auf 1 = 1 es zurückgibt. Dies gilt auch für "Stattdessen", wenn das, was Sie zu sagen versuchen, tatsächlich (natürlich) für Bedingung 1 = 1 zurückgegeben wird. Abgesehen davon, dass die Sprache in den Aufzählungszeichen das Ergebnis einer inneren Verknüpfung nicht klar beschreibt. Was es beschreibt, ist, dass es sich um eine Kreuzverbindung handelt, bei der weniger Zeilen die Bedingung nicht erfüllen. Ebenso ist Ihre Cross-Join-Sprache mit "Kombinationen" nicht klar.
philipxy

7

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 Notation muss man sich nicht um den Unterschied zwischen inneren und Kreuzverbindungen kümmern. Anstelle von zwei "ON" -Klauseln gibt es eine einzige "WHERE" -Klausel, die den Job erledigt. Wenn Sie Schwierigkeiten haben, herauszufinden, welche "JOIN" - "ON" -Klauseln wohin führen, geben Sie die "JOIN" -Notation auf und verwenden Sie die einfachere oben.

Es betrügt nicht.


2

Beim Schreiben von Abfragen mit inneren Verknüpfungen werden die Datensätze aus beiden Tabellen abgerufen, wenn die Bedingung für beide Tabellen erfüllt ist, dh die genaue Übereinstimmung der gemeinsamen Spalte in beiden Tabellen.

Beim Schreiben einer Abfrage mit Cross Join ähnelt das Ergebnis dem kartesischen 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.

Gehen Sie also nicht zum Cross Join, bis Sie das brauchen.


2
Nur wenn die WHERE-Klausel fehlt!
Epitka

2

Cross Join und Inner Join sind gleich, mit dem einzigen Unterschied, dass wir beim Inner Join einige der Ergebnisse des kartesischen Produkts boolesch filtern

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 des Feldes gibt, das wir für den Join verwenden. Join nur Kreuzverknüpfung beider Tabellen und nur die Zeilen erhalten, die einen speziellen booleschen Ausdruck ausführen.

Beachten Sie, dass wir den Filter übergeben würden, wenn die Felder, für die wir unsere Joins ausführen, in beiden Tabellen null wären. Es liegt an uns oder dem Datenbankhersteller, zusätzliche Regeln hinzuzufügen, um Nullen zu vermeiden oder zuzulassen. Bei den Grundlagen handelt es sich lediglich um eine Kreuzverbindung, gefolgt von einem Filter.


0

Der innere Join gibt das Ergebnis übereinstimmender Datensätze zwischen zwei Tabellen an, wobei der Cross-Join die möglichen Kombinationen zwischen zwei Tabellen liefert.


0

A = {1,5,3,4,6,7,9,8} B = {2,8,5,4,3,6,9}

cross join wirken als kartesisches Produkt A ✖ B = {1,2}, {1,8} ..., {5,2}, {5,8}, {5,5} ..... {3,3} ..., {6,6} .... {8,9} und gab diese lange Ergebnismenge zurück ..

bei der Verarbeitung inner joinseines durch kartesisches Produkt fertig und wählen Paaren kombiniert werden .. Wenn diese denken geordneten Paare als zwei Primärschlüssel der Tabelle und Suchen nach Klausel A = B dann inner joinwählen , {5,5}, {4,4}, {6,6} , {9,9} und gab die angefragte Spalte in der select-Klausel zurück, die sich auf diese IDs bezieht.

Wenn cross joinauf a = b, dann ist das Ergebnis dieselbe Ergebnismenge wie inner join. in diesem Fall auch verwenden inner join.


-1

Dies hängt von der erwarteten Ausgabe ab.

Ein Cross-Join ordnet alle Zeilen in einer Tabelle allen Zeilen in einer anderen Tabelle zu. Ein innerer Join stimmt mit einem Feld oder Feldern überein. Wenn Sie eine Tabelle mit 10 Zeilen und eine andere mit 10 Zeilen haben, verhalten sich die beiden Verknüpfungen unterschiedlich.

Beim Cross-Join werden 100 Zeilen zurückgegeben, die nicht miteinander verknüpft sind, sondern nur ein sogenanntes kartesisches Produkt. Der innere Join vergleicht die Datensätze miteinander. Angenommen, einer hat einen Primärschlüssel und das ist ein Fremdschlüssel im anderen, würden 10 Zeilen zurückgegeben.

Ein Cross-Join hat eine begrenzte allgemeine Nützlichkeit, ist jedoch der Vollständigkeit halber vorhanden und beschreibt das Ergebnis des Verbindens von Tabellen, ohne dass der Abfrage Beziehungen hinzugefügt wurden. Sie können einen Cross-Join verwenden, um Listen mit Wortkombinationen oder Ähnlichem zu erstellen. Eine innere Verknüpfung ist dagegen die häufigste Verknüpfung.


Nicht alle zu verwirren. Ich habe versucht, die Antwort zu verkürzen. Dies ist die bestmögliche kurze Antwort.
Shrikant Jadhav
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.