我在使用外部联接工作时遇到了一些麻烦:我曾经让它们按照我在MS Access中的预期工作,但在SQL Server中发生类似事情却给我带来了问题。
我有一个适用于每个学生的分数表,如:
+-------------+------------+-------+
| StudentID | StandardID | Score |
+-------------+------------+-------+
| 100 | 1011 | 1 |
| 100 | 1012 | 2 |
| 101 | 1011 | 3 |
每个学生可能有很多分数,每个分数与一个标准相关。此外,每个学生可能属于一个或多个组,这些组包含在另一个表组中:
+-------------+------------+
| StudentID | GroupID |
+-------------+------------+
| 100 | 83 |
| 101 | 83 |
我想要做的是提取分数信息并按组过滤:然后,此数据集将由StudentID与其他地方的正确记录进行匹配。但是,对于任何给定学生的每个检索数据集,需要具有完全相同的行数:每个标准一个。理想情况下(对于上述数据):
StudentID = 100
+------------+-------------+------------+-------+
| StandardID | StudentID | GroupID | Score |
+------------+-------------+------------+-------+
| 1011 | 100 | 83 | 1 |
| 1012 | 100 | 83 | 2 |
StudentID = 101
+------------+-------------+------------+-------+
| StandardID | StudentID | GroupID | Score |
+------------+-------------+------------+-------+
| 1011 | 101 | 83 | 3 |
| 1012 | 101 | 83 | NULL | <--Can't get this to happen
我可以拉出我想要的列表,但那里没有NULL行。作为另一个例子,如果我对一个学生有4个分数但对另一个学生只有1个分数,我仍然需要查询返回4行,其中没有用于他们没有的分数。
这是我到目前为止所尝试过的(有点冗长,但实质上是这样):
SELECT Standards.StandardID, scores.StudentID, scores.TestDate, scores.Score,
scores.Assessment
FROM scores RIGHT OUTER JOIN
(SELECT scores_1.StandardID
FROM scores AS scores_1 INNER JOIN studentGroups
ON scores_1.StudentID = studentGroups.StudentID
WHERE (studentGroups.GroupID = 83)
GROUP BY scores_1.StandardID) AS Standards
ON scores.StandardID = Standards.StandardID
WHERE scores.StudentID = 100
任何帮助都会很棒!
答案 0 :(得分:0)
您能否为我们提供数据库结构因为要为所有学生返回相同数量的行,您需要创建具有不同StandardID的临时表,然后使用外部联接为所有学生获取相同数量的行。
为进一步和适当的ans提供表结构。
答案 1 :(得分:0)
我使用scores
和groups
作为上述两个表格。你使用了更多的术语,所以我(也许是)有点困惑。但是,这应该有效:
select AllStandards.StandardID,
groups.StudentID,
groups.GroupID,
Scores.Score
from (select distinct StandardID from scores) AllStandards
left join (
scores
join groups
on groups.StudentID = scores.StudentID
)
on AllStandards.StandardID = scores.StandardID
where groups.StudentID=100
我首先创建一个包含所有可用StandardID
的列表,然后对所有学生和分数进行左连接以获取列表。