2016-03-25 5 views
0

Ich muss die Namen der Schüler herausfinden, die mindestens zwei Kurse eingeschrieben haben.SELECT von einer Tabelle ein Element, das mehrmals in einer anderen Tabelle auftritt

erstellen die beiden Tabellen:

CREATE TABLE Student (
    StudentID varchar(20) PRIMARY KEY, 
    FirstName varchar(15), 
    LastName varchar(30), 
    Sex varchar(6), 
    DOB date, 
    Email varchar(40) 
); 

CREATE TABLE Enrols (
    StudentID varchar(20), 
    CourseID varchar(20), 
    CONSTRAINT Student_Course PRIMARY KEY (StudentID,CourseID), 
    FOREIGN KEY (StudentID) REFERENCES Student(StudentID), 
    FOREIGN KEY (CourseID) REFERENCES Course(CourseID) 
); 

My (erfolglos) versucht:

SELECT DISTINCT Student.FirstName, 
    Student.LastName, 
    Enrols.CourseID,     
    COUNT (Student.FirstName) AS NumberOfNames 
    FROM Student 
    INNER JOIN Enrols 
    ON Student.StudentID = Enrols.StudentID 
    WHERE COUNT(Student.Firstname) >= 2; 
+0

Anstelle von dem, wo Sie verwenden müssen 'mit' (mit' Group by' -Klausel) –

+0

Ok danke für die Hilfe –

+0

Warum ist StudentID ein VARCHAR? – Strawberry

Antwort

0
SELECT Student.FirstName AS "First Name", 
    Student.LastName AS "Last Name", 
    Enrols.CourseID AS "Course ID", 
    COUNT(Student.FirstName) AS "Number of Names" 
    FROM Student 
    INNER JOIN Enrols 
    ON Student.StudentID = Enrols.StudentID 
    GROUP BY Student.FirstName 
    HAVING COUNT(Student.FirstName) >= 2; 

Wird arbeiten, aber Sie werden nur ein CourseId sehen. Sie brauchen DISTINCT nicht.

+0

anstelle von 'FirstName' sollten Sie 'StudentID' verwenden, da' FirstName' dupliziert werden kann. –

0

sollten Sie verwenden HAVING und GROUP BY (aber nicht die curseID, wenn Sie verwenden Gruppe von)

SELECT Student.FirstName AS "First Name", 
    Student.LastName AS "Last Name",   
    COUNT (*) AS "Number of Names" 
    FROM Student 
    INNER JOIN Enrols 
    ON Student.StudentID = Enrols.StudentID 
    HAVING COUNT(Student.Firstname) >= 2 
    GROUP BY Student.FirstName, Student.LastName; 
+0

Right @Strawberry .. Ich habe die Antwort aktualisieren .. – scaisEdge

+0

in der Gruppe nach Klausel verwenden Sie nicht 'ASC'. –

0

Anstelle von where können Sie die Kombinationverwendenund having Klausel, wie unten -

SELECT Student.FirstName, 
     Student.LastName, 
     Student.StudentID, 
     COUNT(CourseID) AS NumberOfCourceEnroll 
    FROM Student 
INNER JOIN Enrols 
    ON Student.StudentID = Enrols.StudentID 
group by Student.FirstName, Student.LastName, Student.StudentID 
having COUNT(CourseID) >= 2; 

Sie StudentID werden Gruppierung sollte, da dies in der Tabelle Student Master-Primärschlüssel ist.

0
SELECT DISTINCT s.* 
      FROM student s 
      JOIN enrols x 
      ON x.studentid = s.studentid 
      JOIN enrols y 
      ON y.studentid = x.studentid 
      AND y.courseid < x.courseid;