MSAccess Объединение 2 таблиц в 1 без пробелов

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

Таблица 1 содержит следующую информацию: Модель, SiteID, SiteName, ServiceTag, AssetTag, Floor, Room, FirstName, LastName, STUDENTID, Grade

Таблица 2 содержит следующую информацию: SiteID, SiteName, LastName, FirstName, Grade, STUDENTID.

В Таблице 1 представлены данные из прошлогоднего реестра с участием учащегося и назначенного ему компьютера. В Таблице 2 представлен новый список студентов, участвующих в программе. Некоторые учащиеся из Таблицы 2 совпадают с учащимися из Таблицы 1 (учащиеся, которые все еще участвуют в программе), но есть и другие.

Мне нужно сделать следующее: взять всех учащихся из таблицы 2 и назначить им компьютер, который уже находится в указанном SiteID (школа, в которой находится компьютер), принимая во внимание, что некоторые учащиеся все еще находятся в программе, и они получить их ту же машину, назначенную им, и оставить пробелы там, где мне нужно развернуть новые машины для дополнительных студентов.

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

Редактировать 1:
До сих пор мне удавалось получить запрос, чтобы вернуть мне студентов, которые все еще находятся в программе, и дать им их первоначально назначенную машину, но на других машинах нет назначенных им учеников, я пытаюсь выяснить, как заполнить данные других машин именами новых студентов. Имейте в виду, что я имею дело с несколькими школами, и машины не могут быть перемещены из одной школы в другую, и если в новом списке будет больше учеников, чем раньше, мне придется оставить этих учеников без назначенной им машины и развернуть новые системы.

Редактировать 2:
Ниже приведена версия таблиц в формате CSV и результаты, которые я пытаюсь получить.

TABLE 1
MODEL,SITE_ID,SITENAME,SERVICETAG,ASSETTAG,FLOOR,ROOM,FIRSTNAME,LASTNAME,STUDENTID,GRADE
6420,123,MY SCHOOL,1234GM1,AT0012345,1,102,PETER,PEREZ,100123456,1
6420,123,MY SCHOOL,5678GM1,AT0012346,1,102,PAUL,ANDREWS,100123457,1
6420,123,MY SCHOOL,1234FH1,AT0012347,1,102,JOHN,BERRONDO,100123458,3
6420,123,MY SCHOOL,5678FH1,AT0012348,1,102,ANDREW,JONES,100123459,3
6420,123,MY SCHOOL,12344K1,AT0012349,1,102,JONATHAN,DOE,100123460,4

TABLE 2
SITEID,SITENAME,FIRSTNAME,LASTNAME,STUDENTID,GRADE
123,MY SCHOOL,PAUL,ANDREWS,100123457,2
123,MY SCHOOL,JOHN,BERRONDO,100123458,4
123,MY SCHOOL,ANGEL,YOUNG,100123470,1
123,MY SCHOOL,TANIA,MATTHEWS,100123471,1
123,MY SCHOOL,GEORGE,PEREZ,100123472,2
123,MY SCHOOL,WALTER,DOE,100123473,2
123,MY SCHOOL,MATTHEW,PETERS,100123474,3

RESULTING TABLE
SITE ID,SITENAME,SERVICETAG,ASSETTAG,FIRSTNAME1,LASTNAME2,STUDENTID,GRADE
123,MY SCHOOL,5678GM1,AT0012346,PAUL,ANDREWS,100123457,2
123,MY SCHOOL,1234FH1,AT0012347,JOHN,BERRONDO,100123458,4
123,MY SCHOOL,1234GM1,AT0012345,ANGEL,YOUNG,100123470,1
123,MY SCHOOL,5678FH1,AT0012348,TANIA,MATTHEWS,100123471,1
123,MY SCHOOL,12344K1,AT0012349,GEORGE,PEREZ,100123472,2
123,MY SCHOOL,,,WALTER,DOE,100123473,2
123,MY SCHOOL,,,MATTHEW,PETERS,100123474,3

Я пробовал следующие запросы SQL:

SELECT table2.SITEID, table2.SITENAME, table2.LASTNAME, table2.FIRSTNAME, table2.GRADE, table2.STUDENTID, table1.SERVICETAG, table1.ASSETTAG, 
FROM 
table2 LEFT JOIN table1 ON table2.STUDENTID=table1.STUDENTID;

Этот запрос дает мне полный список студентов в списке, и для тех, кто соответствует старым данным, они сохраняют свои машины, остальные остаются пустыми.

SELECT table1.[SITEID], table1.[SITENAME], table1.[SERVICETAG], table1.[ASSETTAG]
FROM table1 LEFT JOIN [query 1] ON table1.[SERVICETAG] = [query 1].[SERVICETAG]
WHERE ((([query 1].[SERVICETAG]) Is Null));

это дает мне машины, которые еще не назначены ни одному ученику из нового списка.

SELECT table2.SITEID, table2.SITENAME, table2.LASTNAME, table2.FIRSTNAME, table2.GRADE, table2.STUDENTID
FROM table2 LEFT JOIN table1 ON table2.STUDENTID= table1.STUDENTID
WHERE (((table1.STUDENTID) Is Null))
ORDER BY table2.SITEID;

Это дает мне студентов, у которых нет соответствующего компьютера (другими словами, студенты, которым нужна назначенная им машина)

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

ОБНОВЛЕНИЕ 3:
На данный момент я решил использовать Excel, он стал наполовину автоматическим и наполовину ручным. Я использую систему VLOOKUP, которая дает мне то, что мне нужно, но я должен быть осторожен со своими данными.

Я буду обновлять по мере приближения.


person user2521943    schedule 14.11.2013    source источник
comment
Вместо того, чтобы просто запрашивать, не могли бы вы просто использовать Make Table, чтобы создать новую таблицу, которая не содержит существующих студентов?   -  person Grant    schedule 14.11.2013
comment
Проблема в том, что мне нужно иметь возможность назначать машины, уже существующие в школе, на новый список учеников и учитывать, что некоторые ученики возвращаются в этом году из предыдущего списка.   -  person user2521943    schedule 14.11.2013
comment
Так вы просто пытаетесь избежать делать все это вручную? Потому что я почти уверен, что вы можете просто сделать запрос к таблице следующего года, которая содержит повторяющихся студентов. Затем сделайте еще одну таблицу, в которой не появляются повторяющиеся студенты. Объедините эти два после. Таким образом, вы можете сохранить свои старые таблицы на случай, если вам понадобится просмотреть старые данные, и каждый год создавать новые для каждой школы.   -  person Grant    schedule 15.11.2013


Ответы (1)


Вы знакомы с запросами UNION? Это может быть самый простой путь для вас. Это не настоящий ответ, но я пока не могу комментировать, так что это то, что у меня есть. По сути, вы создаете два запроса с (предпочтительно) одинаковым количеством столбцов с одинаковыми данными, но каждый может иметь разные критерии; Например, выберите StudentID, AssetTag из таблицы 1. Внутреннее соединение с таблицей 2 в таблице 1.StudentID = Table2.StudentID UNION. Выберите Table2.StudentID, Table1.AssetTag из таблицы 2.

Не уверен, что это на 100% точно, но, надеюсь, вы поняли идею. Создайте два запроса, сопоставьте столбцы и соедините их в представлении SQL с помощью слова «ОБЪЕДИНЕНИЕ».

Вот Union из предоставленной вами структуры данных:

ВЫБРАТЬ tble1.Model, tble1.Site_ID, tble1.SiteName, tble1.ServiceTag, tble1.AssetTag, tble1.Floor, tble1.Room, tble1.FirstName, tble1.LastName, tble1.StudentID, tble1.Grade FROM tble1 INNER JOIN tble2 ON таблица1.ИД студента = таблица2.ИД студента; UNION SELECT tble1.Model, tble1.Site_ID, tble1.SiteName, tble1.ServiceTag, tble1.AssetTag, tble1.Floor, tble1.Room, tble2.FirstName, tble2.LastName, tble2.StudentID, tble2.Grade FROM tble1 RIGHT JOIN tble2 ON tble1.StudentID = tble2.StudentID WHERE (((tble1.StudentID) равно нулю));

Боюсь, чтобы приблизиться, вам понадобится ручной ввод. Извини.

person craig.white    schedule 14.11.2013
comment
Я попробовал UNION, но он продолжает выдавать ошибку при команде JOIN. - person user2521943; 14.11.2013
comment
Можете выложить SQL? Это поможет уточнить детали. - person craig.white; 14.11.2013
comment
Хм, ненормализованные данные проблематичны для такого рода вещей. Проблема в том, что у вас нет способа (я это вижу) сопоставить поступающих студентов с «неназначенными» компьютерами. Ничто их не связывает, и без этой связи у вас есть декартовы соединения, которые, хотя и полезны в определенных спецификациях, здесь были бы плохими. Вы могли бы сделать это с помощью VBA, написав оператор цикла для перебора доступных ресурсов, но я подозреваю, что это не то, что вам нужно. Я добавлю свой «ответ» выше к Союзу, о котором я говорил, но он по-прежнему требует ручного обновления данных об активах. - person craig.white; 15.11.2013