人员(表格人员)通过了多个学科的考试(表格考试)(表格学科)。 我必须在单元格中使用标记值来获取表[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)
...
我希望它适用于任意范围的学科。
答案 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