2011-04-05 48 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