Вопрос SQL / access: не добавляйте эту запись семестра, если студент И термин уже существует! - PullRequest
1 голос
/ 23 июля 2010

У меня есть еще один вопрос по SQL / access 2007, который кажется очень простым, но я не уверен, как Google для него.

У меня есть таблица STUDENT-TERMS со следующими полями:

StudentTermID

StudentID (ссылки на таблицу STUDENT)

TermID (ссылки на таблицу TERMS)

TermGPA (это фрагмент информации, которую нужно записать)

Стол СТУДЕНТА выглядит так:

StudentID

Имя

Таблица TERMS выглядит следующим образом:

Termid

Дата начала

Дата окончания

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

Затем я могу выполнить запрос на добавление, чтобы получить данные в таблицу STUDENT-TERMS. Что хорошо.

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

StudentTerm ID: 5

StudentID: Тара

TermID: 1011Осень

TermGPA: 3,8

Когда я загружаю и добавляю новый документ, он может по-прежнему содержать эту информацию о Таре, и я хочу, чтобы БД сказала: «Эй, у нас это уже есть, пропустите это», как при добавлении. Как мне это указать?

ЗДЕСЬ ВЫВОД / ОТВЕТ / РЕШЕНИЕ: Спасибо за вашу помощь всем. Вот что я и сделал:

  1. Я создал новое поле в таблице с именем StudentTerm, которое содержит объединение StudentID и Term (например, Tara1011Autumn). Это поле проиндексировано без дубликатов.

  2. Запрос, выполняющий добавление, выглядит следующим образом:

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 ON Students.StudentID = Upload_Students.StudentID;

Этот запрос пытается заполнить поле StudentTerm значением Tara1011Autumn. Если эта строка уже существует в таблице, запись не будет добавлена.

Ответы [ 4 ]

1 голос
/ 23 июля 2010

Создайте уникальный индекс в таблице [student-term] с полями StudentID и StudentTermID в индексе.

Затем, когда вы запустите запрос на добавление, Access скажет вам «# записей не может быть добавлено из-за нарушения ключа», прежде чем спросить вас, хотите ли вы продолжить. Если вы нажмете Да в этом диалоговом окне, то все записи без нарушения будут добавлены, а записи с ошибками будут сохранены в другой таблице.

В действии DoCmd.RunQuery доступны другие параметры, если вы делаете это из VBA для автоматизации этого.

1 голос
/ 23 июля 2010

Если вы выполняете запрос на добавление на основе 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)
0 голосов
/ 23 июля 2010

На основании ответа dcp, но с учетом доступа

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)
0 голосов
/ 23 июля 2010

* Предположение базы данных в 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...