У меня есть другой вопрос о SQL/доступе 2007, который кажется действительно основным, но я не уверен как Google для него.
У меня есть эта таблица STUDENT-TERMS со следующими полями:
StudentTermID
StudentID (связывается с таблицей STUDENT),
TermID (связывается с таблицей TERMS),
TermGPA (это - самородок информации, которая должна быть зарегистрирована),
СТУДЕНЧЕСКАЯ таблица похожа на это:
StudentID
Имя:
Таблица TERMS похожа на это:
TermID
Дата начала
Дата окончания
У меня есть документ со всей информацией, которая загружается в документ Доступа. Этот документ, который я получаю, имеет того же студента и идентификаторы термина, как существуют в базе данных.
Затем я могу выполнить запрос на добавление для получения данных в таблицу STUDENT-TERMS. Который прекрасен.
Как я пишу запрос, таким образом, что существует только одна запись каждого термина для каждого студента? Так, например, у меня есть эти данные в таблице прямо сейчас:
Идентификатор StudentTerm: 5
StudentID: Tara
TermID: 1 011 Осеней
TermGPA: 3.8
Когда я загружаю и добавляю новый документ, он мог бы все еще содержать ту информацию о Tara, и я хочу, чтобы дб сказал "Эй, мы уже имеем это, пропускаем его", поскольку он делает добавление. Как я указываю на это?
ВОТ ЗАКЛЮЧЕНИЕ/ОТВЕТ/РАЗРЕШЕНИЕ: Спасибо за Вашу справку все. Это - то, что я волновал выполнение:
Я сделал новое поле в таблице под названием StudentTerm, который содержит конкатенацию StudentID и Термина (как так: Tara1011Autumn). Это поле индексируется без дубликатов.
Запрос, который выполняет добавление, похож на это:
INSERT INTO StudentTerms (StudentID, TermID, GPA, StudentTerm) ВЫБИРАЕТ Upload_Students. StudentID, Upload_Students. TermID, Upload_Students. GPA, [Upload_Students]! [StudentID] и [Upload_Students]! [TermID] AS Expr1 ОТ ВНУТРЕННЕГО ОБЪЕДИНЕНИЯ Студентов Upload_Students НА Студентах. StudentID = Upload_Students. StudentID;
Этот запрос пытается заполнить поле StudentTerm Tara1011Autumn. Если та строка уже будет существовать в таблице, то она не добавит запись.
Создайте уникальный индекс для таблицы [student-terms] с полями StudentID и StudentTermID в индексе.
Затем, когда вы запустите запрос на добавление, Access сообщит вам: "# записей не удалось добавить из-за нарушения ключа", а затем спросит, хотите ли вы продолжить. Если вы нажмете "Да" в этом диалоговом окне, то все записи без нарушений будут добавлены, а записи с нарушениями будут сохранены в другой таблице.
В действии DoCmd.RunQuery доступны и другие опции, если вы делаете это из VBA, чтобы автоматизировать процесс.
Предполагая, что вы выполняете запрос на добавление на основе SQL, вы можете использовать предложение NOT EXISTS.
Примечание
Здесь я предполагаю, что у вас может быть несколько записей STUDENT-TERMS для одного и того же ученика, если StudentTermID отличается.
INSERT INTO STUDENT-TERMS
( StudentTermId
, StudentId
, TermID
, TermGPA )
SELECT 5
, 'Tara'
, '1011Autumn'
, 3.8
WHERE NOT EXISTS
(SELECT * FROM STUDENT-TERMS WHERE StudentID = 'Tara'
AND StudentTermId = 5)
* База данных предположений находится в 3NF *
SELECT st.StudentId, s.StudentName, t.TermId, t.TermName, st.TermGPA
FROM STUDENTS_TERMS st
INNER JOIN STUDENT s ON st.StudentID = s.StudentId
INNER JOIN TERMS t on st.TERMS = t.TermId
WHERE st.StudentID = 5
На основе ответа dcp, но с поправкой на Access
INSERT INTO STUDENT-TERMS
( StudentTermId
, StudentId
, TermID
, TermGPA )
SELECT DISTINCT 5
, 'Tara'
, '1011Autumn'
, 3.8
FROM STUDENT-TERMS
WHERE NOT EXISTS
(SELECT * FROM STUDENT-TERMS WHERE StudentID = 'Tara'
AND StudentTermId = 5)