Вопрос о SQL/доступе: не добавляйте ту запись студенческого термина, если студент И термин уже существуют!

У меня есть другой вопрос о 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, и я хочу, чтобы дб сказал "Эй, мы уже имеем это, пропускаем его", поскольку он делает добавление. Как я указываю на это?

ВОТ ЗАКЛЮЧЕНИЕ/ОТВЕТ/РАЗРЕШЕНИЕ: Спасибо за Вашу справку все. Это - то, что я волновал выполнение:

  1. Я сделал новое поле в таблице под названием StudentTerm, который содержит конкатенацию StudentID и Термина (как так: 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 НА Студентах. StudentID = Upload_Students. StudentID;

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

1
задан Tara 26 July 2010 в 15:30
поделиться

4 ответа

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

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

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

1
ответ дан 2 September 2019 в 22:48
поделиться

Предполагая, что вы выполняете запрос на добавление на основе 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)
1
ответ дан 2 September 2019 в 22:48
поделиться

* База данных предположений находится в 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
0
ответ дан 2 September 2019 в 22:48
поделиться

На основе ответа 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)
0
ответ дан 2 September 2019 в 22:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: