2017-02-24 1 views
0

Lassen Sie uns sagen, dass ich habe zwei einfache Tabellen mit den folgenden Spalten und Daten:LEFT JOIN - zwei Tabellen mit den gleichen Daten

Table 1    Table 2 

year month   year month 
2017 01    2017 01 
2016 12    2016 12 

Der Primärschlüssel ist ein Verbundschlüssel, des Jahres und des Monats besteht .

Also eine klassische linke Join, gibt mir alle Daten in der linken Tabelle mit den passenden Zeilen in der rechten Tabelle.

Wenn ich trete ein links wie folgt aus:

select 
t1.year, t2.month 

from 
table1 t1 
    left join table 2 t2 on (t1.year = t2.year and t1.month = t2.month) 

Warum ich nur zwei Reihen erhalten haben ?? Soll ich nicht 4 Reihen bekommen ??

Tnx, Tom

+0

't1' hat keine' god' Spalte. –

+2

Sie sollten 2 Zeilen erhalten.Sie haben zwei Zeilen in 't1', die exakt mit zwei Zeilen in' t2' übereinstimmen. Was wäre Ihre erwartete Ausgabe, wo Sie 4 Datensätze erhalten würden? Vielleicht bekommen Sie LEFT OUTER JOIN mit einem CROSS JOIN verwechselt, wo Sie ein kartesisches Produkt bekommen würden? – JNevill

+0

Ich bin ein wenig verwirrt, sollte die Abfrage nicht die Zeilen finden, die auf dem Primärschlüssel der ersten Tabelle in der zweiten Tabelle übereinstimmen? Da der linke Join immer alle Daten in der Tabelle 1 anzeigt, warum werden die Daten in der Tabelle 2 verworfen (auch wenn es gleich ist)? Tom –

Antwort

2

Eine klassische linke beitreten werden Sie die Anzahl der Zeilen in der „Left Table“ geben (die in aus) durch die Anzahl der Spiele in der „Right Table“ multipliziert (der in LEFT JOIN in diesem Fall), plus alle Zeilen in der LINKEN Tabelle, die keine Übereinstimmung in der ersten Tabelle haben.

  • Anzahl der Zeilen in der linken Tabelle = 2
  • Anzahl der Spiele in der rechten Tabelle = 1
  • Anzahl der Zeilen in der linken Tabelle withouth Streichhölzer = 0

2 x 1 + 0 = 2

Edit: Tatsächlich ist die Multiplikation für jede Zeile angegeben. Wäre so etwas wie

Sum (row_i x matches_i) + unerreichte

Wo row_i ist, bedeutet jede Zeile, und matches_i in der ersten Tabelle mit den Spielen für die i-Reihe. Der Unterschied dabei ist, dass jede Zeile unterschiedliche Anzahl von Spielen haben könnte (die vorherige Formel, um Ihren Fall nur angepasst)

Dies führt

1 (row1) x 1 (Treffer für Reihe 1) + 1 (row2) x 1 (Übereinstimmungen für die Zeile 2) + 0 (unübertroffene Zeilen in Tabelle 1) =

1x1 + 1x1 resultieren + 0 =

1 + 1 = 2 = Ergebnis

führen

Wenn Sie 4 Reihen erwarteten, wollten Sie vielleicht ein kartesisches Produkt. Wie der Kommentar sagt, können Sie in diesem Fall Kreuz Join verwenden.

+0

Die Schlussfolgerung ist richtig, aber nicht die Erklärung. Beide Zeilen der zweiten Tabelle stimmen überein. Die Anzahl der Übereinstimmungen in der rechten Tabelle ist 2. –

+0

Ich aktualisierte die Erklärung. Wie auch immer, ich habe nie gesagt, dass es Reihen in der zweiten Tabelle gibt, die unerreicht sind - vielleicht war es nicht klar, was ich sagen wollte –

0

Sie erhalten zwei Zeilen, da beide Spalten zwei Zeilen haben, die genau dem sam entsprechen und ein zusammengesetzter Schlüssel. Es wird den gleichen Weg machen, wenn Sie 4 Reihen in jedem hatten, erhalten Sie nur 4 Reihen insgesamt.

0

Die linke Verknüpfung nimmt Tabelle1 (t1) als linke Tabelle. Es sucht und ruft alle Werte von rechts ab, dh: - aus Tabelle 2 (t2) entspricht den Kriterien T1.Jahr & Monat = T2.Jahr & Monat (alias GOD/s) sowie die zusätzliche Join-Bedingung T1.Month = T2.Monat. Das Ergebnis ist, dass nur zwei Zeilen von T1 den Verknüpfungskriterien sowie den zusätzlichen Verknüpfungskriterien entsprechen.

Noch ein Mitnehmen: Die AND T1.Month = T2.Month-Bedingung auf der linken Verknüpfung ist redundant, da der zusammengesetzte GOD-Schlüssel dafür sorgt davon explizit.

Results of the Left Join

2

Wenn Sie Tabellen miteinander zu verbinden, sind Sie im Wesentlichen die Datenbank fragt Daten aus zwei verschiedenen Tabellen zu kombinieren und sie als einen einzelnen Datensatz anzuzeigen. Wenn Sie eine left join ausführen, Sie sagen:

Gib mir alle Zeilen aus Tabelle 1, sowie alle zugehörigen Daten aus Table2 (falls vorhanden).

In diesem Sinne hat die Daten von Tabelle 2 nicht separaten oder zusätzliche Datensätze Table1 darstellen (obwohl sie als separate Datensätze in einer separaten Tabelle gespeichert sind), stellt es zugeordnet Daten. Sie verknüpfen die Daten zwischen den Tabellen und hängen keine Zeilen aus jeder Tabelle an.

Stellen Sie sich vor, dass Tabelle1 Personen gespeichert und Tabelle2 Telefonnummern gespeichert.

  Table1       Table2 
+------+-------+--------+   +------+-------+-------------+ 
| Year | Month | Person |   | Year | Month | Phone  | 
+------+-------+--------+   +------+-------+-------------+ 
| 2017 | 12 | Bob |   | 2017 | 12 | 555-123-4567| 
| 2016 | 01 | Frank |   | 2016 | 01 | 555-234-5678| 
+------+-------+-------+   +------+-------+--------------+ 

Sie könnten sie zusammenführen, um eine Liste von Personen und deren entsprechenden Telefonnummern zu erhalten. Aber Sie würden nicht erwarten, eine Kombination von Zeilen aus jeder Tabelle (zwei Reihen von Personen und zwei Reihen von Telefonnummern) zu erhalten.

0

cross join gibt jede Zeile zurück, die Sie erstellen können, indem Sie eine Zeile aus jedem Argument kombinieren. (inner) join on gibt die Zeilen aus cross join zurück, die ihre Bedingung erfüllen. Ie (inner) join on gibt jede Zeile zurück, die Sie erstellen können, die eine Zeile aus jedem Argument kombiniert und deren Bedingung erfüllt.

left join on gibt die Zeilen aus (inner) join on und die Zeilen, die Sie durch die Erweiterung unverbundene linkes Argument Reihen von null für Spalten des rechten Arguments machen.

Beachten Sie, dass dies unabhängig von Primärschlüsseln, eindeutigen Spaltensätzen, Fremdschlüsseln oder anderen Einschränkungen ist.

Hier sind zwei Zeilen in jedem Argument, so dass es 2 X 2 = 4 Zeilen in der cross join gibt. Aber nur 2 erfüllen die Bedingung - die, wo eine Reihe mit sich selbst verbunden ist.

(Wenn Sie left join eine Tabelle mit sich selbst, wenn die Bedingung ist die Verbindung von einem oder mehreren Gleichheiten der linken und rechten Versionen einer Spalte und es gibt keine null s in diesen Spalten dann jede linke Argument Reihe mit an verbunden wird Das heißt, es gibt keine nicht zusammenhängenden linken Argumentzeilen, so dass nur die Zeilen des (inner) join on zurückgegeben werden.)