it-swarm.com.de

Wann eine linke äußere Verbindung verwenden?

Ich verstehe nicht das Konzept eines Left Outer Join, eines Right Outer Join oder warum wir überhaupt einen Join verwenden müssen! Die Frage, mit der ich zu kämpfen habe, und der Tisch, an dem ich arbeite, ist hier: Link

Frage 3(b) 

Konstruieren Sie einen Befehl in SQL, um die folgende Abfrage zu lösen, und erläutern Sie, warum sie die (Äußere) Join-Methode verwenden musste. [5 Punkte] "Finden Sie den Namen jedes Mitarbeiters und seines/ihrer unterhaltsberechtigten Ehepartner (falls vorhanden)"

Frage 3(c) - 

Konstruieren Sie einen Befehl in SQL, um die folgende Abfrage zu lösen. Verwenden Sie dazu (i) die join-Methode und (ii) die [10 Punkte] “Identifizieren Sie den Identitätsnamen jedes Mitarbeiters, der mehr als 20 Stunden am Computerization Project gearbeitet hat.”

Kann mir bitte jemand das einfach erklären?

27
John Conrad

Joins werden verwendet, um zwei zusammengehörige Tabellen miteinander zu kombinieren.

In Ihrem Beispiel können Sie die Employee-Tabelle und die Department-Tabelle wie folgt kombinieren:

SELECT FNAME, LNAME, DNAME
FROM
EMPLOYEE INNER JOIN DEPARTMENT ON EMPLOYEE.DNO=DEPARTMENT.DNUMBER

Das würde zu einem Recordset wie führen:

FNAME   LNAME   DNAME
-----   -----   -----
John    Smith   Research
John    Doe     Administration

Ich habe oben einen INNER JOIN verwendet. INNER JOINs fasst zwei Tabellen zusammen, so dass only Datensätze mit Übereinstimmungen in beiden Tabellen angezeigt werden und in diesem Fall join auf der Abteilungsnummer stehen (Feld DNO in Employee, DNUMBER in Department-Tabelle).

Mit LEFT JOINs können Sie zwei Tabellen kombinieren, wenn Sie Datensätze in der ersten Tabelle haben, aber möglicherweise nicht Datensätze in der zweiten Tabelle. Angenommen, Sie möchten eine Liste aller Angestellten sowie aller unterhaltsberechtigten Personen:

SELECT EMPLOYEE.FNAME as employee_first, EMPLOYEE.LNAME as employee_last, DEPENDENT.FNAME as dependent_last, DEPENDENT.LNAME as dependent_last
FROM
EMPLOYEE INNER JOIN DEPENDENT ON EMPLOYEE.SSN=DEPENDENT.ESSN

Das Problem hier ist, dass, wenn ein Mitarbeiter keinen einen unterhaltsberechtigten Mitarbeiter hat, der Datensatz überhaupt nicht angezeigt wird, da in der Tabelle DEPENDENT kein übereinstimmender Datensatz vorhanden ist.

Sie verwenden also einen left - Join, der alle Daten auf der "linken" (d. H. Der ersten Tabelle) speichert und alle übereinstimmenden Daten auf der "rechten" (der zweiten Tabelle) abruft:

SELECT EMPLOYEE.FNAME as employee_first, EMPLOYEE.LNAME as employee_last, DEPENDENT.FNAME as dependent_first, DEPENDENT.LNAME as dependent_last
FROM
EMPLOYEE LEFT JOIN DEPENDENT ON EMPLOYEE.SSN=DEPENDENT.ESSN

Jetzt erhalten wir alle der Mitarbeiterdatensätze. Wenn für einen bestimmten Mitarbeiter keine übereinstimmenden Abhängigkeiten vorhanden sind, sind die Felder dependent_first und dependent_last null.

78
Jordan Reiter

Beispiel (verwendet nicht Ihre Beispieltabellen :-)

Ich habe eine Autovermietung.

Table car
id: integer primary key autoincrement
licence_plate: varchar
purchase_date: date

Table customer
id: integer primary key autoincrement
name: varchar

Table rental
id: integer primary key autoincrement
car_id: integer
bike_id: integer
customer_id: integer
rental_date: date

Einfach richtig? Ich habe 10 Datensätze für Autos, weil ich 10 Autos habe.
Ich habe dieses Geschäft seit 10 Jahren geführt, also habe ich 1000 Kunden.
Und ich vermiete die Autos ungefähr 20x pro Jahr pro Auto = 10 Jahre x 10 Autos x 20 = 2000 Mietwagen.

Wenn ich alles in einer großen Tabelle speichere, habe ich 10x1000x2000 = 20 Millionen Datensätze.
Wenn ich es in 3 Tabellen speichere, habe ich 10 + 1000 + 2000 = 3010 Datensätze.
Das sind 3 Größenordnungen, deshalb verwende ich 3 Tabellen. 

Da ich jedoch 3 Tabellen (um Platz und Zeit zu sparen) benötige, muss ich Joins verwenden, um die Daten wieder herauszuholen
(zumindest wenn ich Namen und Nummernschilder anstelle von Nummern haben möchte).

Verwenden von inneren Verbindungen

Alle Vermietungen für Kunden 345?

SELECT * FROM customer
INNER JOIN rental on (rental.customer_id = customer.id)
INNER JOIN car on (car.id = rental.car_id)
WHERE customer.id = 345.

Das ist ein INNER JOIN, weil wir nur über Autos linked to-Verleiher linked to-Kunden wissen möchten, die tatsächlich passiert sind.

Beachten Sie, dass wir auch eine bike_id haben, die eine Verknüpfung zum Fahrradtisch herstellt, der dem Autotisch ziemlich ähnlich ist, sich aber unterscheidet. Wie würden wir alle Fahrrad- und Autovermietungen für den Kunden 345 erhalten?.
Wir können versuchen und das tun

SELECT * FROM customer
INNER JOIN rental on (rental.customer_id = customer.id)
INNER JOIN car on (car.id = rental.car_id)
INNER JOIN bike on (bike.id = rental.bike_id)
WHERE customer.id = 345.

Aber das wird ein leeres Set geben !!
Dies liegt daran, dass eine Vermietung entweder ein bike_rental OR und ein car_rental sein kann, aber nicht beide gleichzeitig.
Und die nicht funktionierende inner join-Abfrage liefert nur Ergebnisse für alle Vermietungen, bei denen wir sowohl ein Fahrrad als auch ein Auto in derselben Transaktion vermieten.
Wir versuchen, eine boolesche OR-Beziehung mithilfe eines booleschen AND-Joins zu erhalten. 

Verwenden von äußeren Verknüpfungen

Um das zu lösen, benötigen wir einen outer join.

Lösen wir es mit left join

SELECT * FROM customer
INNER JOIN rental on (rental.customer_id = customer.id) <<-- link always
LEFT JOIN car on (car.id = rental.car_id) <<-- link half of the time
LEFT JOIN bike on (bike.id = rental.bike_id) <<-- link (other) 0.5 of the time.
WHERE customer.id = 345.

Schau es so an. Ein inner join ist eine AND und ein left join ist eine OR wie im folgenden Pseudocode:

if a=1 AND a=2 then {this is always false, no result}
if a=1 OR a=2 then  {this might be true or not}

Wenn Sie die Tabellen erstellen und die Abfrage ausführen, können Sie das Ergebnis sehen.

zur Terminologie

Ein left join ist das gleiche wie ein left outer join. Eine join ohne zusätzliche Präfixe ist ein inner join Es gibt auch einen full outer join. In 25 Jahren Programmierung habe ich das nie benutzt.

Warum Links beitreten

Nun, es sind zwei Tische beteiligt. In dem Beispiel haben wir verlinkt
Kunde kann mit einem inner join vermietet werden, in einem inneren Join müssen beide Tabellen muss verlinkt werden, sodass zwischen der left:customer-Tabelle und der right:rental-Tabelle kein Unterschied besteht.

Der nächste Link war ein left join zwischen left:rental und right:car. Auf der linken Seite müssen alle Zeilen miteinander verbunden sein und auf der rechten Seite müssen sie nicht. Deshalb ist es ein left join

25
Johan

Sie verwenden äußere Joins, wenn Sie alle der Ergebnisse aus einer der Join-Tabellen benötigen, unabhängig davon, ob in der anderen Tabelle eine übereinstimmende Zeile vorhanden ist oder nicht.

2
Oded

Im Allgemeinen: JOIN fügt zwei Tabellen zusammen . Verwenden Sie INNER JOIN, wenn Sie "nachschlagen" möchten, wie zum Beispiel detaillierte Informationen zu einer bestimmten Spalte. _ liste alle Informationen der 2 Tabellen auf.

0
Sheng Chen

Ich denke, Frage 3(b) ist verwirrend, weil ihre gesamte Prämisse falsch ist: Sie müssen keine äußere Verknüpfung verwenden, um die Abfrage zu "lösen", z. Beachten Sie Folgendes (der Syntax der Prüfungsarbeit ist wahrscheinlich weise):

SELECT FNAME, LNAME, DEPENDENT_NAME
  FROM EMPLOYEE, DEPENDENT
 WHERE SSN = ESSN
       AND RELATIONSHIP = 'SPOUSE'
UNION 
SELECT FNAME, LNAME, NULL
  FROM EMPLOYEE
EXCEPT 
SELECT FNAME, LNAME, DEPENDENT_NAME
  FROM EMPLOYEE, DEPENDENT
 WHERE SSN = ESSN
       AND RELATIONSHIP = 'SPOUSE'
0
onedaywhen