2013-02-19 4 views
3

Так что я искал вокруг и не нашел много. Я приговариваю заранее, потому что это, вероятно, неправильный способ сделать это, но это то, что есть.Вставка уникальных записей в MS-доступ 2007

Так что мне нужно отслеживать, что сотрудники этой группы завершили работу. Это делается через лист Excel, который передает базу данных доступа MS. Есть три поля, которые мне предоставляются.

Полное имя, название курса и дата завершения.

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

Joe Somebody, Course#1, 14feb13

Joe Somebody, Course#2, 15feb13

Joe Somebody, Course#1, 15feb13

Мне нужен запрос, который добавит первые 2 строки в таблицу, но проигнорирует третий из-за человека, уже пройдя курс №1. это то, что у меня до сих пор, что в основном превращает мое поле имени в основной ключ.

INSERT INTO table [Full name], [Course], [Date] 

SELECT excel_table.[Full name], excel_table.[Course], excel_table.[Date] 

FROM excel_table 

WHERE excel_table.[Full name] Not in (SELECT table.[Full Name] FROM table) 

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

+1

Так что вам нужно (FullName, CourseName) скомпонованный ключ. Не знаете, как работать в MS Access, но для mysql я создал демо http://sqlfiddle.com/#!2/8e17a/1. Надеюсь, это поможет –

+0

Это помогает мне думать, что я могу использовать ваш код с очень небольшими корректировками в доступе. Большое спасибо! – divdeamor

ответ

2

Самый простой способ сделать это, чтобы вы не получали дубликатов, - это добавить индекс. В этом случае составной первичный ключ будет ответом. Просто выберите все поля, которые необходимо включить в составной ключ и нажмите кнопку Первичный ключ:

add composite primary key

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

Joe Somebody, Course#1, 14feb13  <-- good 
Joe Somebody, Course#2, 15feb13  <-- good 
Joe Somebody, Course#1, 15feb13  <-- fails 
Joe SomebodyElse, Course#1, 14feb13 <-- good 

Теперь, если вы запустите обычный Append запрос построить с помощью окна конструктора запросов, вы получите сообщение об ошибке, если существует запись дважды в таблице импорта Excel или уже существует в Access:

error on append

+0

И вышесказанное позволяет использовать несколько одинаковых имен с разными курсами? и наоборот? – divdeamor

+0

Да, если комбинация двух полей отличается, это будет разрешено. Нули в любом из полей не будут разрешены. – Fionnuala

+0

Благодарю вас также. Угадайте, я не полностью понял Первичный ключ. Я думал, что первичный ключ сделает каждое поле уникальным, не объединяя их. Еще раз спасибо :) – divdeamor

0

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

create table CourseCompletions (
    ID autoincrement primary key 
, FullName varchar(100) 
, CourseName varchar(100) 
, CompletionDate date 
); 

Тогда вы можете глоток во всех данных из файла Excel:

insert into CourseCompletions (
, FullName 
, CourseName 
, CompletionDate 
) select 
    [Full name] 
, [Course] 
, [Date] 
from excel_table; 

Это даст каждую строку вашей входной таблицы Excel уникальный номер и запишет его в таблице Access. Теперь вам нужно решить, как вы хотите отклонить конфликтующие строки из таблицы CourseCompletions. (Следующие запросы показывают только те записи, которые вы решили не отклонить.) Если вы хотите отказаться от заканчивания тем же лицом одного и того же курса на более поздний срок:

select 
    ID 
, FullName 
, CourseName 
, min(CompletionDate) 
from CourseCompletions 
group by 
    ID 
, FullName 
, CourseName; 

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

Если вы хотите отказаться от какого-либо завершения курса, который появился в начале таблицы Excel:

select 
    cc1.ID 
, cc1.FullName 
, cc1.CourseName 
, cc1.CompletionDate 
from CourseCompletions as cc1 
inner join (
    select 
    max(ID) as WantedID 
    , FullName 
    , CourseName 
    from CourseCompletions 
    group by FullName, CourseName 
) as cc2 
on cc1.ID = cc2.WantedID; 

И отклонять курс доработки, которые появились позже в таблице Excel, просто замените MAX с MIN.

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

Смежные вопросы