Соедините три таблицы в двух столбцах с пробелами, где они не совпадают - PullRequest
1 голос
/ 23 марта 2019

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

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

Три таблицы:

Student Table

English Test Table

Math Test Table

Как видите,Тест MEG10 разделен между английским и математическим языками, так как они написаны вместе и проходят одинаковый тест.Именно здесь меня сбивают с толку, так как я хочу, чтобы объединение отображало все результаты, когда тесты отображаются на английском и математическом языках.Однако, когда тесты разделены, я хочу, чтобы в столбцах «Английский» или «Математика» были пробелы с «материалом» (потому что в этих столбцах, которые должны быть пустыми) фактически нет информации, соответственно.По сути, когда я присоединяюсь к ним, я хочу, чтобы результирующая таблица была такой, как показано ниже.

enter image description here

Код, который я использую для присоединения к ним::

SELECT 
    m.ID, m.Test, m.M_Col1, m.M_Col2, m.M_Col3,
    e.E_Col1, e.E_Col2, e.E_Col3,
    s.First, s.Last
FROM M_Table AS m
INNER JOIN E_Table AS e ON (m.Test = r.Test)
JOIN S_Table AS s ON (m.ID = s.ID AND e.ID = s.ID)
WHERE m.Test LIKE '%2013%';

Это дает мне:

Results that I am getting from my JOIN

Теперь я понимаю, что присоединяюсь к столбцу Test, что означаетчто я должен получать только те тесты, которые они оба делят, но я не уверен, как присоединиться к нему, чтобы получить результаты, которые я хочу.Более того, я знаю, что беру только столбец теста из математической таблицы, но мне не нужны два столбца теста.

Я уверен, что есть способ сделать это, я просто не уверен, как.Если мне нужно уточнить мой вопрос, пожалуйста, дайте мне знать.

Ответы [ 2 ]

1 голос
/ 23 марта 2019

Вы можете использовать FULL OUTER JOIN для получения записей с обоих концов отношений между таблицей Math и таблицей English.По сути, FULL OUTER JOIN возвращает все записи из обеих таблиц, объединяя их, когда условия объединения совпадают, в противном случае заполняются столбцы отсутствующего отношения в NULL.

SELECT 
    COALESCE(m.ID, e.ID) id, COALESCE(m.Test, e.Test) Test, 
    m.M_Col1, m.M_Col2, m.M_Col3, 
    e.E_Col1, e.E_Col2, e.E_Col3, 
    s.First, s.Last
FROM M_Table AS m
FULL OUTER JOIN E_Table AS e ON m.Test = e.Test AND e.ID = e.ID
INNER JOIN S_Table AS s ON COALESCE(m.ID, e.ID) =  s.ID
WHERE COALESCE(m.Test, e.Test) LIKE '%2013%';

Совет: объединение таблиц Math иАнглийский, вероятно, упростит дизайн вашей базы данных.Какая польза от разделения информации на две таблицы, которые имеют одинаковую структуру, и как она будет масштабироваться, когда в игру вступает больше предметов?Вы можете просто использовать уникальную таблицу с дополнительным столбцом для хранения названия темы (математика, английский, ...).

1 голос
/ 23 марта 2019

Вам нужен список всех идентификаторов и тестов - вы можете получить это вот так

SELECT m.ID, m.Test FROM Math_Table as M
UNION
SELECT e.ID, e.Test FROM English_Table as E

Запустите это и поймите вывод

Затем вы берете это и присоединяетесь к немуимена и левые присоединяются к тестам, подобным этому

SELECT m.ID, m.Test, m.M_Col1, m.M_Col2, m.M_Col3, e.E_Col1, e.E_Col2, e.E_Col3, s.First, s.Last
FROM (
  SELECT m.ID, m.Test FROM Math_Table as M
  UNION
  SELECT e.ID, e.Test FROM English_Table as E
) as base
JOIN S_Table as S ON Base.ID = S.ID
LEFT JOIN M_Table AS m ON m.ID = base.ID AND m.Test = base.Test
LEFT JOIN E_Table AS e ON e.ID = base.ID AND e.Test = base.Test 
WHERE base.Test LIKE '%2013%'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...