Реляционная база данных Sybase SQL Dynamic Select (Joins?)

Я пишу веб-страницу, на которой отображаются оценки учащихся в старом формате журнала оценок, то есть отображается имя ученика, затем его оценка за каждое задание (в строке), а затем повторяется одна строка для каждого ученика. Мои таблицы настроены следующим образом (сокращено до необходимой информации):

Таблица: Назначение
* Assignment_PK (первичный ключ)
* Assignment_Name

Таблица: Student
* Student_PK (первичный ключ)
* Student_Name

Таблица: StudentAssignment
* SA_PK (первичный ключ
* Student_FK (Student.Student_PK)
* Assignment_FK (Assignment.Assignment_PK)
* Score

Я пытаюсь написать оператор SELECT, который будет печатать имя и оценку учащихся для каждого задания. Проблема, с которой я сталкиваюсь, заключается в том, что если я выбираю оценку как столбец, я получаю оценку только для одного задания, потому что в моем WHERE Assignment_FK = Assignment_PK я могу выбрать только одну оценку для столбца.

Я новичок в реляционных базах данных, и мне действительно не помешала бы помощь в поиске лучшего способа справиться с этим. Одно из предложений заключалось в том, что я должен написать оператор SELECT, чтобы выбрать всех студентов в таблицу, затем выполнить строку foreach в таблице, выбрать баллы и поместить их в соответствующий столбец. Это кажется медленным и ненужным процессом. Есть ли более простой способ использования JOINS? Или написать лучший SELECT?


person Tyler Ferraro    schedule 05.04.2011    source источник
comment
посмотрите таблицы PIVOT. это намного проще, если вы заранее знаете количество заданий... (что является большим ЕСЛИ).   -  person Randy    schedule 05.04.2011
comment
Стол PIVOT был именно тем, что мне было нужно. Я могу сделать первоначальный запрос, чтобы заранее получить количество заданий. В Sybase нет встроенных функций PIVOT или TRANSFORM. Вместо этого мне пришлось загрузить все свои данные, а затем написать объект C# для чтения данных, преобразования и отображения в нужном мне формате. Однако PIVOT Table отлично работала бы, если бы Sybase поддерживала ее.   -  person Tyler Ferraro    schedule 11.04.2011


Ответы (1)


Это должно дать вам необходимые данные. Затем вы можете попытаться преобразовать его в желаемый формат отображения, что может быть проще в вашем приложении, чем в базе данных.

SELECT s.Student_Name, a.Assignment_Name, sa.Score
    FROM Student s
        INNER JOIN StudentAssignment sa
            ON s.Student_PK = sa.Student_FK
        INNER JOIN Assignment a
            ON sa.Assignment_FK = a.Assignment_PK
    ORDER BY s.Student_Name, a.Assignment_Name
person Joe Stefanelli    schedule 05.04.2011