2011-04-05 94 views
2

我正在编写一个网页,以旧的成绩簿格式显示学生成绩,也就是说,它会显示学生姓名,然后显示每个作业的成绩(连续)然后为每个学生重复一行。我的表设置如下(缩短到必要的信息):Sybase SQL动态选择(加入?)关系数据库

表:分配
* Assignment_PK(主键)
* ASSIGNMENT_NAME

表:学生
* Student_PK(主键)
* Student_Name

表:StudentAssignment
* SA_PK(主键
* Student_FK(Student.Student_P K)
* Assignment_FK(Assignment.Assignment_PK)
*分数

我试图写一个SELECT语句,将打印学生的名字和分数每项任务。我遇到的问题是,如果我将SELECT Score列作为列,我只能得到一个赋值的分数,因为在我的WHERE Assignment_FK = Assignment_PK中只允许我为列选择一个分数。

我对关系型数据库相当陌生,我真的可以用最好的方式来解决这个问题。一个建议是,我编写了一个SELECT语句,将所有学生选入一个表格,然后在表格中做一个foreach行,并让它选择分数并将它们放在适当的列中。这似乎是一个缓慢而不必要的过程。有没有更简单的方法使用JOINS?或者写一个更好的SELECT?

+0

查找PIVOT表。如果你事先知道分配的数量,这很容易......(这是一个大的IF)。 – Randy 2011-04-05 18:06:38

+0

一个PIVOT表正是我所需要的。我可以做一个初步的查询,以提前获得分配的数量。 Sybase没有内置的PIVOT或TRANSFORM功能。相反,我必须加载所有数据,然后编写一个C#对象来读取数据,并以我想要的格式进行转换和显示。如果Sybase支持它,那么一个PIVOT表可以很好地工作。 – Genzume 2011-04-11 19:10:03

回答

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