SQL Server外连接问题

时间:2013-04-06 05:57:32

标签: sql-server outer-join

我在使用外部联接工作时遇到了一些麻烦:我曾经让它们按照我在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

任何帮助都会很棒!

2 个答案:

答案 0 :(得分:0)

您能否为我们提供数据库结构因为要为所有学生返回相同数量的行,您需要创建具有不同StandardID的临时表,然后使用外部联接为所有学生获取相同数量的行。

为进一步和适当的ans提供表结构。

答案 1 :(得分:0)

我使用scoresgroups作为上述两个表格。你使用了更多的术语,所以我(也许是)有点困惑。但是,这应该有效:

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的列表,然后对所有学生和分数进行左连接以获取列表。