Хотите найти ребенка с самым высоким уровнем образования в школе, которая работает над проектом? - PullRequest
0 голосов
/ 09 октября 2018

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

Я составил следующие таблицы

CREATE TABLE [dbo].[School](
    [Name] [varchar](50) NOT NULL,
    [studentID] [varchar](50) primary key   NOT NULL,
    [MentorID] [varchar](50),
) ON [PRIMARY]
GO

CREATE TABLE [dbo].[PROJECT](
    [PID] [int] primary key  NOT NULL,
    [ProjectName] [varchar](30) NOT NULL,
) ON [PRIMARY]
GO

CREATE TABLE [dbo].[WorksOn](
    [SID] [varchar](50) FOREIGN KEY REFERENCES School(studentID) NOT NULL,
    [ProjID] [int] FOREIGN KEY REFERENCES PROJECT(PID) NOT NULL,
    primary key(SID,PID),
) ON [PRIMARY]
GO

Я пытаюсь написать запрос, который может получить имячеловека самого высокого уровня, работающего над проектом.Таким образом, проект1 может иметь первокурсник, 2 второкурсника и младшего.Он вернет имя этого младшего.

Интересно, стоит ли добавить [GradeLevel] к школьному столу?Будет ли это проще?

Также, скажем, у project2 есть один новичок и два второкурсника.Он должен вернуть имя двух второкурсников.

edit-query, который я пытаюсь

SELECT p.ProjectName AS "Project", s.Name AS "Highest ranking memeber/s"
    FROM PROJECT p
    inner JOIN School s 
        ON p.PID = s.ProjectID
    where min(s.Level)-- level 1 being a senior, 2 a junior.
group by PROJECT.ProjectName

, если у Project1 есть bob (первокурсники), jule (sophmore), betty (junior),тогда он должен вернуть betty для project1.

1 Ответ

0 голосов
/ 09 октября 2018

У вас есть недостаток в вашем текущем дизайне.
В настоящее время у вас есть две разные таблицы, связывающие studentId с MentorId (кстати, varchar(50), вероятно, не лучший выбор для столбца id,но это другая история).

Если вы хотите отслеживать, кто кого наставляет, вы можете сохранить эти отношения либо в таблице School, либо в таблице WorksOn (плохое имя, ИМХО. Такое имя, как MentorToStudentгораздо лучше передал бы смысл этой таблицы).

Если все, что вас волнует, это уровень успеваемости учеников, но вас не волнует, какой именно младший наставник, какой именно второкурсник, вместо того, чтобы иметь MentorID столбец, вы должны удалить таблицу WorksOn и просто добавить столбец GradeLevel в таблицу School.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...