Объединение трех столов вместе

У меня есть две таблицы, к которым я смог правильно присоединиться. Я пытаюсь ввести третью таблицу, в которой даже если в конкретном году нет данных, мне все равно нужны значения null или 0. Моя проблема в том, что когда я присоединяюсь к этой таблице, я получаю либо повторяющиеся записи, либо записи вообще не отображаются.

Вот что я пробовал:

SELECT *
FROM [4th grade math achievement levels] m
  INNER JOIN [4th grade reading achievement levels] r
    ON m.Location = r.Location
      AND m.TimeFrame = r.TimeFrame
      AND m.[Achievement Level] = r.[Achievement Level]
  RIGHT OUTER JOIN [4th graders who scored below proficient reading level by geographic location] g
    ON m.Location = g.Location
      AND m.TimeFrame = g.TimeFrame
WHERE m.Location = 'ohio'
  AND m.TimeFrame = 2011

введите здесь описание изображения

желаемый результат Местоположение | Уровень достижений | Данные | Географическое положение | Данные | TimeFrame вот что я пытаюсь объединить введите здесь описание изображения


person Troy Bryant    schedule 18.02.2014    source источник
comment
Пользователь оставил внешнее соединение, чтобы сравнить ваше значение, вы получите результаты, а затем вы можете решить, где вы застряли, вы не предоставили достаточно информации. здесь   -  person Just code    schedule 18.02.2014
comment
согласен, правильное внешнее соединение - ваша проблема.   -  person mikey    schedule 18.02.2014
comment
Обычно рекомендуется не использовать пробелы в ваших идентификаторах (именах таблиц/столбцов и т. д.). Вероятно, вам также не нужны отдельные таблицы для каждого класса — это больше зависит от столбцов в этих таблицах, но ни один из перечисленных вами столбцов не является специфичным для 4-го класса.   -  person Clockwork-Muse    schedule 18.02.2014
comment
Можете ли вы добавить подписи к каждой из этих таблиц? Является ли верхний результат вашего запроса? Какие два нижних? Математика и чтение?   -  person wruckie    schedule 20.02.2014
comment
Мы можем видеть только очень небольшую часть ваших данных, но в двух таблицах (при условии, что это таблицы по математике и чтению) в столбце местоположения указано «Огайо», а в другом — «США» в столбце местоположения. Является ли один столбец местоположения по существу столбцом страны, а другие - штатом?   -  person wruckie    schedule 20.02.2014
comment
столбец местоположения одинаков во всех таблицах для определения состояния. В третьем столбце у вас есть местоположение для штата и географического местоположения, такого как сельский район, город, пригород и т. Д. В любом случае, я смотрел на это, нет уникального способа объединить мои данные без создания дубликатов. Я считаю, что мне придется добавить еще одно ограничение и дать пользователю возможность выбрать уровень достижения И географическое положение.   -  person Troy Bryant    schedule 21.02.2014


Ответы (2)


Я почти уверен, что вам нужен left outer join, а не right outer join:

SELECT * 
FROM [4th grade math achievement levels] m INNER JOIN
     [4th grade reading achievement levels] r 
     ON m.location = r.location AND
        m.timeframe = r.timeframe AND
        m.[achievement level] = r.[achievement level] LEFT OUTER JOIN
        [4th graders who scored below proficient reading level by geographic location] g 
        ON m.location = g.location AND
           m.timeframe = g.timeframe 
WHERE m.location = 'ohio' AND
      m.timeframe = 2011; 

left outer join будет хранить все результаты из таблиц m и r, которые соответствуют условиям, создавая NULL для значений в g, которые не совпадают. В вашей форме запроса все строки были взяты из таблицы g (right outer join). Но поскольку несовпадающие строки в таблице m будут иметь NULL значений, они будут отфильтрованы. В результате right outer join действительно вел себя как inner join.

person Gordon Linoff    schedule 18.02.2014

Вам нужно переместить предложение where в ваше соединение в качестве условия соединения. Когда вы указываете это в предложении where, вы заставляете запрос отбрасывать Nulls

select *
from [4th grade math achievement levels] m
inner join [4th grade reading achievement levels] r
on m.Location = r.Location
    and m.TimeFrame = r.TimeFrame
    and m.[Achievement Level] = r.[Achievement Level] 
    and m.Location = 'ohio' -- old where clause
    and m.TimeFrame = 2011
right outer join [4th graders who scored below proficient reading level by geographic location] g
    on m.Location = g.Location
    and m.TimeFrame = g.TimeFrame
person wruckie    schedule 18.02.2014
comment
это объединило все таблицы, но создало дубликаты в первых двух таблицах. - person Troy Bryant; 19.02.2014
comment
тогда каждая строка в третьей таблице имеет ссылку на две строки в одной из первых двух таблиц. Есть кое-что о том, как соотносятся ваши данные, что нам еще не ясно. Третья таблица основана на людях, верно? Итак, ваше правое внешнее соединение сделано специально, верно? Есть ли у каждого учащегося в таблице 3 соответствующая строка по математике и другая по чтению? - person wruckie; 19.02.2014
comment
Если у вас нет только одного студента на каждый временной период и место, таблицы m и r будут повторяться, когда это необходимо. Можете ли вы опубликовать образец вывода? - person wruckie; 19.02.2014
comment
Все три таблицы имеют основное местоположение, такое как местоположение (например, Огайо) и временные рамки (2011 г.). В третьей таблице указано местоположение, а затем географическое местоположение, например, сельский пригород или другое. А вот чего нет у третьей таблицы, так это уровня достижений. Но вскоре я опубликую образец вывода, чтобы все стало ясно как грязь. Спасибо - person Troy Bryant; 19.02.2014
comment
добавлено, как выглядят результаты выполнения вашего запроса - person Troy Bryant; 20.02.2014