lau*_*ura 5 sql database sql-server
这是我今天的第二个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'
Run Code Online (Sandbox Code Playgroud)
是否可以将查询命名为别名?
或者我怎么能加入这两个查询,所以输出如下:
| A.Id | SIoC1 | SIoCScore1 | PIoC1 | PIoCScore1 |
Run Code Online (Sandbox Code Playgroud)
**更新**背后的域名是进行评估,学校和家长必须在该评估中报告.因此,单行标识评估,其中包含School和Parent值.
我正在使用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
Run Code Online (Sandbox Code Playgroud)
进一步更新(拿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)
Run Code Online (Sandbox Code Playgroud)
因此,对于系统中的每个学生,只有两个评估 - 一个类型为"学校",另一个类型为"父母".
我想创建一个结合评估和关注点的行:
(伪列:)
| Assessment.StudentId | SchoolConcernTopic | SchoolConcernLevel | ParentConcernTopic | ParentConcernLevel |
Run Code Online (Sandbox Code Playgroud)
或者从上面的sql:
| PreConcerns.StudentId | SIoC1 | SIoCScore1 | PIoC1 | PIoCScore1 |
Run Code Online (Sandbox Code Playgroud)
每个学生只填充一行,结合两种评估.我有这个结构使用上面的SQL,但它返回两行!我无法弄清楚如何更新这个只返回一个 - 感谢任何帮助!
一如既往地谢谢!
确保在第一个查询中指定所需的字段名称,然后在UNION ALL两个查询中指定;如果您希望将一组结果标记在另一组结果的末尾。
忽略我的第一个答案,我正在接受垃圾,因为这不会得到你想要的结果。对不起。
如果您希望输出具有重复的列,其中SIoC1和PIoC1本质上相同,但名称不同,具体取决于该行是来自“学校”还是“家长”,那么您的结果集最终将以 NULL 结束,例如(由于您不提供样本数据,因此使用随机数据)
| A.Id | SIoC1 | SIoCScore1 | PIoC1 | PIoCScore1 |
1 A 10 NULL NULL -- Row type 'School'
2 NULL NULL B 20 -- Row type 'Parent'
etc. etc.
Run Code Online (Sandbox Code Playgroud)
如果数据存储在同一个表中,具有相同的字段名称,则使用其他字段来区分行,例如Type,并在结果中显示。