【发布时间】:2011-02-02 14:37:36
【问题描述】:
这是我今天的第二个 SQL 问题 - 我是 DBA 方面的新手...
我正在尝试将一个复杂的 sql 查询连接在一起,以将大约 12 个表中的数据合并到 1 个单个表中。尽管数据库中存在一对多关系,但我知道每个关系的最大数量是多少。
所以,我已经(在堆栈溢出的帮助下!)展平了我的数据库的第一级,并且有一对查询,现在必须将它们连接在一起:
(略)
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
进一步更新(2 次!)** (我不确定我是否应该将其作为一个新问题重新打开??!) 我今天回去工作,发现我上面的“解决方案”并没有完全解决问题——它为每个评估创建了两行。
回顾一下,我有以下表格:
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 的结构,但它返回两行!而且我不知道如何更新它以只返回一个 - 任何帮助都非常感激!
一如既往的感谢!
【问题讨论】:
标签: sql sql-server database