2016-04-20 13 views
0

Ich versuche, die folgenden zwei relationale Algebra in Standard-Englisch zu konvertieren, aber ich habe Probleme zu verstehen, was genau die durchteuft tutSQL Query SCHNEIDET - Relationale Algebra

Ich weiß, dass INTERSECT die Werte findet, die in beiden select-Anweisungen auftreten

ich habe seine SQL-Abfrage, aber ich kann einfach nicht herausfinden, geschaffen zu finden, was es in einfachem Englisch fragt

jemand in der Lage wäre, zu helfen?

Relationale Algebra:

Πstudent_name(σcourse id=“CS1850“(student Natural Join enrolled)) ∩ 
Πstudent_name(σcourse id=“CS1840“(student Natural Join enrolled)) 

SQL:

SELECT student_name FROM student NATURAL JOIN enrolled WHERE 
course_id='CS1850' INTERSECT SELECT student_name FROM student 
NATURAL JOIN enrolled where student_name='CS1840' 

Zweiter Ausdruck:

Πstudent_name(σe1.student 
id=e2.student_id∧e1.course_id<>e2.course_id(student natural join 
(ρe1(enrolled) × ρe2(enrolled)))) 

SELECT student_name FROM student NATURAL JOIN enrolled e1 NATURAL JOIN 
e2 WHERE e1.student_id = e2.student_id 
+0

In menschlicher Sprache: "Finden Sie alle Schüler in 'CS1850', und finden Sie alle Schüler in 'CS1840 eingeschrieben, und geben Sie die Schnittmenge dieser beiden Ergebnismengen zurück" oder "Finden Sie alle Schüler in * beide *' CS1850 'und' CS1840 '. " – JimmyB

+0

@JimmyB - Ich verstehe - irgendwelche Ideen über die zweite? – RandomMath

+0

Das zweite SQL stimmt nicht mit dem algebraischen Ausdruck überein. Es fehlt die 'e1.course id <> e2.course'. – JimmyB

Antwort

0

Tanne st, nicht verwenden NATURAL JOIN. Es ist ein Fehler, der darauf wartet, zu passieren. Es stimmt mit Tabellen überein, die auf den Namen von gemeinsamen Spalten basieren. Es verwendet nicht einmal ordnungsgemäß deklarierte Fremdschlüsselbeziehungen. Verwenden Sie stattdessen USING oder ON, um explizit die für den Beitritt verwendeten Spalten anzugeben.

Zweitens brauchen Sie nicht INTERSECT. Es gibt zwei typische Methoden, die GROUP BY oder JOIN verwenden.

In Englisch erhält die Abfrage die Schüler, die in beiden Klassen angemeldet sind.

SELECT s.student_name 
FROM student s JOIN 
    enrolled e 
    USING (student_id) -- or whatever 
WHERE e.course_id IN ('CS1850', 'CS1840') 
GROUP BY s.student_name 
HAVING COUNT(*) = 2; 

Hinweis: Dies setzt voraus, dass zwei Schüler nicht den gleichen Namen haben.

Eine Alternative verwendet nur JOIN:

SELECT s.student_name 
FROM student s JOIN 
    enrolled e1 
    USING (student_id) JOIN 
    enrolled e2 
    USING (student_id) 
WHERE e1.course_id = 'CS1850' AND 
     e2.course_id = 'CS1840'; 

Wenn die zugrunde liegenden Tabellen keine Duplikate haben, dann ist dies kein GROUP BY oder DISTINCT benötigt.

+0

Wie unterscheidet sich die obige Abfrage oder Ihre Abfrage von der Frage ** WHERE course_id = 'CS1850' UND course_id = 'CS1840' **? – RandomMath

+0

@RandomMath. . . Meine Abfrage gibt die Schüler in beiden Klassen zurück. Ihre 'WHERE'-Klausel filtert immer alle Schüler heraus (weil' course_id' nicht beide Werte in derselben Zeile annehmen kann). –

+0

Oh, ich verstehe - Mein Ausdruck wurde vollständig hochgeladen - es gibt auch eine weitere erweiterte Abfrage, über die ich nicht ins Englische übersetzen kann – RandomMath