SQL:如何使此查询更灵活

时间:2011-02-16 10:36:46

标签: sql

人员(表格人员)通过了多个学科的考试(表格考试)(表格学科)。 我必须在单元格中使用标记值来获取表[person / discipline]。

如何创建比此更灵活的查询:

SELECT 
  p.*,  -- persons 
  ae.*, -- "A" exam mark 
  be.*, -- "B" exam mark 
  ...

FROM 
  Person p,
  LEFT OUTER JOIN Exam ae ON (p.Id = ae.PersonId and ae.DisciplineId = 1)
  LEFT OUTER JOIN Exam be ON (p.Id = be.PersonId and be.DisciplineId = 2)
  ... 

我希望它适用于任意范围的学科。

2 个答案:

答案 0 :(得分:1)

您可以按人分组,并使用案例选择适当的标记:

SELECT  p.Name
,       min(case when e.DisciplineId = 1 then e.Mark end) as Exam_A_Mark
,       max(case when e.DisciplineId = 2 then e.Mark end) as Exam_B_Mark
FROM    Person p
LEFT JOIN 
        Exam e 
ON      p.Id = e.PersonId
GROUP BY
        p.Id
,       p.Name

请注意,正确的SQL方法是每次检查向客户端返回一行,并让客户通过每次检查将一行“旋转”一行到每个检查的一列来格式化结果。

答案 1 :(得分:1)

灵活的是什么意思?您需要提供有关您想要的更多信息。

猜测下面的内容可能会给你你想要的东西,尽管如果你提供关于表格结构的更多信息,我们可以确定你想要做什么。

SELECT 
  p.*,  -- persons 
  (CASE When ae.DisciplineID = 1 THEN ae.Mark ELSE null END) as 'A_Mark',
  (CASE When ae.DisciplineID = 2 THEN ae.Mark ELSE null END) as 'B_Mark',
  ...
FROM 
  Person p,
  LEFT OUTER JOIN Exam ae ON (p.Id = ae.PersonId)
ORDER BY p.Id, ae.DisciplineId