2016-04-30 4 views
0

Ich lese ein Buch über SQL und ich bin auf ein Beispiel fest, das zu einem Datenbankschema verwandt ist, wie unten im Bild gezeigt. THE DATABASE SCHEMADie WHERE-Klausel in Verbindung mit NATURAL JOIN SQL verwenden?

Das Beispiel löst unter die Abfrage wie in dem Buch heißt es: „Führen Sie die Namen der Ausbilder zusammen mit den Titeln von Kursen, die sie lehren“

Angenommen, wir wollen die Anfrage beantworten Die Abfrage sein kann in SQL geschrieben wie folgt:

select name , title 
from instructor natural join teaches , course 
where teaches.course id = course.course id; 

nun das Buch heißt es, dass

"Beachten Sie, dass teaches.course id im wo cl ause bezieht sich auf das Kurs-ID-Feld des natürlichen Join-Ergebnisses, da dieses Feld wiederum aus der Teach-Beziehung stammt. „

das Buch wieder Zustände in BOLD, dass:

“ Es ist nicht möglich, Namen zu verwenden, schreibt die ursprüngliche Beziehung Namen enthalten, zum Beispiel instructor.name oder teaches.course id, um Eigenschaften in den natürlichen Bezug zu nehmen Join Ergebnis; Wir können jedoch Attributnamen wie Name und Kurs-ID, ohne die Beziehung Namen. "

(Verweis auf die Abfrage oben) Wenn es nicht möglich ist, wie kommt der Autor konnte die Abfrage schreiben als

teaches.course id = course.course id 

Wie teaches.course den natürlichen Join Attribut „Course“ beziehen kann, hat der Autor so zweideutig streckt seine arguments.Please erklärt mir die Augen des Autors Ansicht.

+0

SQL Server unterstützt 'NATURAL JOIN' nicht, daher kann die Frage nicht auf dieser Datenbank basieren. –

+0

Die Frage ist allgemein über die SQL-Sprache nicht über SQL-Server. Ich habe es gerade als zusätzliches Tag benutzt. –

+2

'von Instructor Natural Join lehrt, natürlich 'würde ich sagen: Brennen Sie das Buch! 'Natural Join' wird allgemein als böse angesehen, und in Kombination mit dem Commalis des alten Stils ist es nicht zu erkennen. – wildplasser

Antwort

5

ignorieren, was das Buch hat sagen Sie über NATURAL JOIN. Vermeiden Sie es einfach. NATURAL JOIN ist ein Bug, der darauf wartet, passieren. Warum? T Die Join-Join-Schlüssel werden einfach durch Benennung von Konventionen für Spalten in den Tabellen definiert. Es werden alle Spalten verwendet, die denselben Namen haben. In der Tat ignoriert NATURAL JOIN richtig definiert FOREIGN KEY Beziehungen; und sie verbergen die Schlüssel, die tatsächlich für den Abgleich verwendet werden.

Seien Sie also explizit und verwenden Sie stattdessen die ON oder USING Klauseln. Diese beziehen sich explizit auf die verwendeten Schlüssel und der Code ist verständlicher und wartbarer.

Dann folgen Sie einer einfachen Regel: Nie Verwenden Sie Kommas in der FROM Klausel; immer verwenden explizite JOIN Syntax.

Also, eine gute Möglichkeit, Ihre Abfrage zu schreiben, wäre so etwas wie dieses:

select i.name, c.title 
from instructor i inner join 
    teaches t 
    on t.instructor_id = i.instructor_id inner join 
    course c 
    on t.course_id = i.course_id; 

Hinweis, dass es keine where Klausel und alle Spalten sind qualifiziert, was bedeutet, dass sie in der Tabelle angeben, sie kommen .

Auch sehe ich keine instructor_id Spalte in der teaches Tabelle, so ist dies nur ein Beispiel dafür, wie vernünftiger Code aussehen würde.

+0

Vielen Dank –