2012-04-13 19 views
2

ich SQL Server 2008 verwenden, und ich habe 4 Tabellen StudentAbsentees, Students, StudentSections und SectionsSQL innerer Join zwischen zwei Tabellen

In der StudentAbsentees Tabelle ich die studentId bin zu speichern, die nicht anwesend sind (Abwesenden nur) an einem bestimmten Tag wie,

StudentId  Time  Date   
    ----------- ------ ------ 
     1   10:00 2012-04-13 

und in den StudentSections ich die studentId in einem bestimmten Abschnitt an Speicherung wie

StudentId SectionId 
    ---------- ------------ 
     1    1 
     2    1 
     3    1 

und in der Students Tabelle Ich speichere Student Details, ebenfalls in Sections Tabelle Ich habe Abschnitt Details wie Name und Kapazität dieses Abschnitts.

ich diese Tabellen müssen sich registrieren und zeigen an, ob der Schüler an einem bestimmten Tag anwesend/abwesend ist ... sollte das Ergebnis sein

StudentId Status 
--------- ------ 
    1   Absent 
    2   Present 
    3   Present 

ich die Abwesenden Liste aus diesen Tabellen bekommen, ich weiß nicht, wie anzuzeigen, ob sie vorhanden/nicht vorhanden sind .... kann mir hier jemand helfen

Antwort

3
select * from (
    select s.id, 
      case 
       when sa.date = '2012-01-01' 
       then 'absent' 
       else 'present' 
      end as status, 
      ROW_NUMBER() OVER (PARTITION BY s.id ORDER BY CASE WHEN sa.date = '2012-01-01' THEN 1 ELSE 2 END) AS RowNumber 
    from students s 
    left outer join studentabsentees sa on s.id = sa.studentid 
) 
as a where a.RowNumber = 1 
+0

seine Anzeige Fehler wie ungültige Syntax in der Nähe von 'ist' und wenn ich die sa entfernen. [Datum] funktioniert es aber die Ausgabe ist falsch – shanish

+1

@ Shanish: Bitte versuchen Sie meine bearbeitete Antwort. –

+0

danke für Ihre Antwort juergen, es zeigt alle Status als 'abwesend' – shanish

1

Sie ist Abfrage des Status aller Studierenden für einen bestimmten Tag zu zeigen, würde so aussehen:

select s.id, s.name, a.status 
from student s 
left join studentabsentees a on s.id = a.studentid 
where a.date = ? 

O Natürlich müssen Sie ein Datum angeben.

Hinweis: Ihre Frage verwendet "Inner Join" im Titel. Ich denke, links ist eine bessere Passform, weil es für alle Schüler zeigen würde. Aber wenn Sie wirklich nur diejenigen wollen, die einen Datensatz in der Abwesenheitstabelle haben, dann könnten Sie einfach das Wort "links" in der Abfrage zu "inner" ändern.

Anmerkung2: Meine Abfrage geht von einem Statusfeld aus. Wenn Sie keinen haben, schauen Sie sich die Antwort von juergen d's an.

+0

danke Tim Ich werde es überprüfen und lassen Sie es wissen – shanish

+0

Ich habe die Frage falsch gelesen und habe nicht gesehen, dass der Status nicht in der Tabelle studentabsempfänger ist, Sie sollten sich @juergen d's Antwort ansehen, wie Sie mit der Statusanzeige umgehen können basierend auf null Daten –

1

Keine Notwendigkeit für beitritt, die Sie gerade eingestellt Operatoren verwenden:

SELECT StudentID, 'Absent' 
FROM StudentsAbsentees 
WHERE [date] = ... 
UNION 
(
SELECT StudentID, 'Present' 
FROM Students 
EXCEPT 
SELECT StudentID, 'Present' 
FROM StudentsAbsentees 
WHERE [date] = ... 
) 

Sie können nur die Auswahl, sie als Konstante ‚Anwesend‘ und ‚Abwesend‘ angezeigt werden soll. Es ist einfach, die Liste aller abwesenden Studenten zu bekommen. Dann verbinde das mit allen gegenwärtigen Studenten. Gegenwärtige Schüler werden gefunden, indem man die komplette Schülerliste nimmt und den Operator außer den fehlenden Schülern benutzt. Aber in diesem Ausnahme-Teil stellen Sie sicher, dass Sie die abwesenden Schüler als Geschenk auswählen, so dass sie sich von der Liste aller Schüler mit Gegenwart neben ihrem Namen, die Sie gerade erstellt haben, abheben.