You would typically want to have a Subjects table with numeric keys like your Students table. Your Subjects table is not in normal form.
I suggest that you use three tables like so:
Students:
StudentID (int)
StudentName (VarChar(100))
StudentSubject:
StudentID (int)
SubjectID (int)
Subject:
SubjectID (int)
SubjectName (VarChar(100))
Your query to return all combinations would look something like this:
select StudentName, SubjectName
from Students inner join StudentSubject on Students.StudentID = StudentSubject.StudentID
inner join Subjects on StudentSubject.SubjectID = Subject.SubjectID
Here's a complete query to create and return rows from these tables:
-- run if tables exist:
drop table Students
drop table Subjects
drop table StudentSubject
go
create table Students (StudentID int not null identity, StudentName VarChar(100) not null)
create table Subjects (SubjectID int not null identity, SubjectName VarChar(100) not null)
create table StudentSubject (StudentID int not null, SubjectID int not null)
insert into Students (StudentName) select 'Fred'
insert into Students (StudentName) select 'Barney'
insert into Students (StudentName) select 'Wilma'
insert into Students (StudentName) select 'Betty'
insert into Subjects (SubjectName) select 'Nuclear Physics'
insert into Subjects (SubjectName) select 'History'
insert into Subjects (SubjectName) select 'Basket Weaving'
insert into Subjects (SubjectName) select 'Geography'
insert into StudentSubject (StudentID, SubjectID) select 1, 1
insert into StudentSubject (StudentID, SubjectID) select 1, 2
insert into StudentSubject (StudentID, SubjectID) select 2, 3
insert into StudentSubject (StudentID, SubjectID) select 2, 4
insert into StudentSubject (StudentID, SubjectID) select 3, 1
insert into StudentSubject (StudentID, SubjectID) select 3, 2
insert into StudentSubject (StudentID, SubjectID) select 3, 4
insert into StudentSubject (StudentID, SubjectID) select 4, 2
insert into StudentSubject (StudentID, SubjectID) select 4, 3
insert into StudentSubject (StudentID, SubjectID) select 4, 4
select * from Students
select * from Subjects
select * from StudentSubject
select StudentName from
(
select Students.StudentID, StudentName, Subjects.SubjectID, SubjectName
from Students inner join StudentSubject on Students.StudentID = StudentSubject.StudentID
inner join Subjects on StudentSubject.SubjectID = Subjects.SubjectID
where Subjects.SubjectID IN (2, 4)
) as ss
group by ss.StudentID, ss.StudentName
having Count(ss.SubjectID) = 2
------------------------------------------------
Something to think about:
In an enrollment system, students take classes, not subjects. This means that ideally you would have a Classes table containing a SubjectID foreign key and the bridge table would be StudentClass rather than StudentSubject.
Have fun
select
Paul Turley, MCSD, MCDBA, MCT, MSF Practitioner
|