2013-04-06 3 views
0

У меня возникли проблемы с получением внешнего соединения для работы: у меня были такие работы, как я ожидал в MS Access в прошлом, но получение подобной вещи, происходящей в SQL Server, дает меня беспокоит.Ошибка внешнего соединения 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 строки, возвращаемых запросом, с NULL для очков, которых у них нет.

Это то, что я пытался до сих пор (чуть более многословным, но по существу):

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

Можете ли вы предоставить нам структуру базы данных. Чтобы вернуть такое же количество строк для всех учащихся, вам необходимо создать временную таблицу с разными стандартными идентификаторами, а затем использовать внешнее соединение для получения того же количества строк для всех учащихся.

предоставить структуру таблицы для дальнейших и соответствующих ан.

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, а затем сделать левый присоединиться ко всем студентам и оценки, чтобы получить список.

Смежные вопросы