使用self Joins扩展数据库表

时间:2013-09-16 22:46:51

标签: sql left-join outer-join self-join

我在一个包含两列三列ID, NAME, SUBJECT, SCORE的数据库中有一个表 主题math, physics,biology只有三个可能的值,并且每个值在得分字段中都有相应的分数。因为每个学生可以参加多个课程,NAME列不是唯一的。

我想扩展表格,使得主题的每个值都成为一列,所以我不再有主题和分数列,换句话说,我将NAME, MATH,PHYSICS,BIOLOGY数学物理和生物学的价值是得分,然后NAME列变为唯一

我现在通过使用查询

来做到这一点
SELECT T1.NAME, T2.SCORE AS BIOLOGY, T3.SCORE AS PHYSICS, T4.SCORE AS MATH
FROM studenttable T1
LEFT JOIN studenttable T2
ON T1.ID = T2.ID AND T2.SUBJECT = 'biology'
LEFT JOIN studenttable T3
ON T1.ID = T3.ID AND T3.SUBJECT = 'physics'
LEFT JOIN studenttable T4
ON T1.ID = T4.ID AND T4.SUBJECT = 'math'

这似乎有效,但我想知道是否有更好的方法来实现这一目标?还是更整洁的方式?请告诉

2 个答案:

答案 0 :(得分:0)

假设id唯一标识了学生,id, subject在表格中是唯一的,并且每个id都具有相同的name

Select
    id,
    name,
    min(case when subject='biology' then score end) as biology,
    min(case when subject='physics' then score end) as physics,
    min(case when subject='math' then score end) as math,
From
    studenttable
Group By
    id,
    name

如果您的数据库支持pivot,则使用它可能更简单。

答案 1 :(得分:0)

我不知道它是否会被认为是更好的方式,但枢轴可能会更清洁。

select *
from (
  select name, subject, score
  from studenttable
) pivot (
  max(score),
  for subject in ('biology', 'physics', 'math')
)