这是我今天的第二个SQL问题 - 我在DBA方面有点新手...
我正在尝试将一个复杂的SQL查询连接起来,将大约12张表中的数据合并成一张表。虽然数据库中存在一对多的关系,但我知道每个关系的最大数量。
因此,我已经(在stack overflow的帮助下!)展开了我的数据库的第一层,并拥有一对查询,现在必须将它们连接在一起:
(节选)
我正在尝试将一个复杂的SQL查询连接起来,将大约12张表中的数据合并成一张表。虽然数据库中存在一对多的关系,但我知道每个关系的最大数量。
因此,我已经(在stack overflow的帮助下!)展开了我的数据库的第一层,并拥有一对查询,现在必须将它们连接在一起:
(节选)
SELECT
A.StudentId, C1.Topic AS SIoC1, C1.Level AS SIoCScore1
FROM Assessment A
LEFT JOIN Concern C1 ON A.Id = Assessment_Id and C1.TopicNumber = 1
WHERE A.Type = 'School'
SELECT
A.StudentId, C1.Topic AS PIoC1, C1.Level AS PIoCScore1
FROM Assessment A
LEFT JOIN Concern C1 ON A.Id = Assessment_Id and C1.TopicNumber = 1
WHERE A.Type = 'Parent'
是否可以给查询命名别名?
或者我该怎么样将这两个查询连接起来,使输出结果像这样:
| A.Id | SIoC1 | SIoCScore1 | PIoC1 | PIoCScore1 |
**更新** 这个问题的背后是进行评估,学校和家长都必须报告。因此,单行标识具有学校和家长值的评估。
我正在使用SQL Server 2005。
谢谢!
*进一步更新* 这个查询似乎可以完成任务...
SELECT PreConcerns.StudentId, TIoC1, TIoCScore1, PIoC1, PIoCScore1
FROM
Assessment PreConcerns
LEFT OUTER JOIN
(
SELECT
P.StudentId, C1.Topic AS TIoC1, C1.Level AS TIoCScore1
FROM Assessment P
LEFT JOIN Concern C1 ON P.Id = C1.Assessment_Id and C1.TopicNumber = 1
WHERE P.Type = 'School'
) scons
ON scons.StudentId= PreConcerns.StudentId
LEFT OUTER JOIN
(
SELECT
P.StudentId, C1.Topic AS PIoC1, C1.Level AS PIoCScore1
FROM Assessment P
LEFT JOIN Concern C1 ON P.Id = C1.Assessment_Id and C1.TopicNumber = 1
WHERE P.Type = 'Parent'
) pcons
ON pcons.StudentId = PreConcerns.StudentId
进一步更新(第二次!)** (我不确定是否应该将其作为一个新问题重新打开?!) 今天回到工作岗位,发现我上面的“解决方案”并没有完全解决问题 - 它会为每个评估创建两行。
因此,简要回顾一下,我有以下表格:
Student (int:id, varchar(50):name)
Assessment (int:id, date:date, int:StudentId, )
Concern (int:id, int:assessment_id, varchar(20):topic, int:level)
对于系统中的每个学生,都会有两个评估——一个类型为“学校”,一个类型为“家长”。
我想创建一行将评估和关注点结合起来:
(伪列:)
| Assessment.StudentId | SchoolConcernTopic | SchoolConcernLevel | ParentConcernTopic | ParentConcernLevel |
或从上面的SQL语句中:
| PreConcerns.StudentId | SIoC1 | SIoCScore1 | PIoC1 | PIoCScore1 |
只有每个学生填写一行,结合两次评估。 使用上述SQL语句可以实现此结构,但是会返回两行!我无法确定如何更新它以仅返回一行-非常感谢您的帮助!!
一如既往地感谢!