Так,

У меня с собой 3 стола.

Пользователи (Id, FirstName, LastName)
Курсы (CourseId, CourseTitle, Faculty)
CourseEnrollment (StudentId, CourseId, FinalGrade)

Теперь я должен: Создайте представление с помощью
а. Имя студента
б. Фамилия студента
c. Название курса
d. Имя преподавателя
е. Фамилия факультета
f. Итоговая оценка

Поскольку имена студентов и преподавателей хранятся в одной таблице (Пользователи), я решил сделать временный просмотр имени студента, фамилии студента и названия курса.

CREATE VIEW FirstView ([Student First Name],[Student Last Name],[Course Title])
    AS  

        SELECT Users.FirstName,Users.LastName, Courses.CourseTitle
                FROM Users
                INNER JOIN CourseEnrollment
                        ON CourseEnrollment.StudentId=Users.NTID
                INNER JOIN Courses
                        ON Courses.CourseId=CourseEnrollment.CourseId; 

Для выполнения основной работы сейчас ... я создаю новое представление, подобное этому:

SELECT FirstView.[Student First Name],FirstView.[Student Last Name],FirstView.[Course Title], Users.FirstName, Users.LastName, CourseEnrollment.FinalGrade
                FROM FirstView
                 JOIN Courses
                        ON Courses.CourseTitle LIKE FirstView.[Course Title]  -- only those courses which are there in first view
                 JOIN Users
                        ON Users.NTID LIKE Courses.Faculty   -- only the faculty users added
                 INNER JOIN CourseEnrollment
                        ON CourseEnrollment.CourseId LIKE Courses.CourseId;

Проблема в том, что ... если я не добавлю столбец итоговой оценки и не присоединюсь к CourseEnrollment ... он будет работать нормально. Но как только я это сделаю ... он создает беспорядок и создает несколько строк для каждого ученика. С оценками других студентов.

Кто-нибудь знает, как я могу это обойти?

0
rbk 31 Мар 2014 в 14:14

1 ответ

Лучший ответ

Если поле faculty в таблице курсов относится к пользователю, возможно, это то, что вам нужно:

SQL Fiddle

Настройка схемы MS SQL Server 2012 :

CREATE TABLE Users ( Id int , FirstName varchar(20), LastName varchar(20))
CREATE TABLE Courses ( CourseId int , CourseTitle varchar(20), Faculty int)
CREATE TABLE CourseEnrollment ( StudentId int, CourseId int, FinalGrade int)

INSERT Users VALUES (1, 'John', 'Adams')
INSERT Users VALUES (2, 'Steve', 'Student')
INSERT Users VALUES (3, 'Fred', 'Faculty')
INSERT Courses VALUES (1, 'DB 101', 3)
INSERT Courses VALUES (2, 'DB 201', 3)
INSERT CourseEnrollment VALUES (1,1,30)
INSERT CourseEnrollment VALUES (2,1,50)
INSERT CourseEnrollment VALUES (2,2,75)

Запрос 1 :

SELECT
    u.FirstName AS [Student FirstName], u.LastName as [Student LastName],
    c.CourseTitle,
    faculty.FirstName AS [Faculty FirstName],
    faculty.LastName AS [Faculty LastName],
    ce.FinalGrade
FROM Users u
INNER JOIN CourseEnrollment ce ON u.Id = ce.StudentId
INNER JOIN Courses c ON c.CourseId = ce.CourseId
INNER JOIN Users faculty ON c.Faculty = faculty.Id

Результаты :

| STUDENT FIRSTNAME | STUDENT LASTNAME | COURSETITLE | FACULTY FIRSTNAME | FACULTY LASTNAME | FINALGRADE |
|-------------------|------------------|-------------|-------------------|------------------|------------|
|              John |            Adams |      DB 101 |              Fred |          Faculty |         30 |
|             Steve |          Student |      DB 101 |              Fred |          Faculty |         50 |
|             Steve |          Student |      DB 201 |              Fred |          Faculty |         75 |
1
jpw 31 Мар 2014 в 14:35
Большое спасибо. Я всю ночь пытался понять это.
 – 
rbk
31 Мар 2014 в 14:56
Рад был помочь :)
 – 
jpw
31 Мар 2014 в 14:57