2013-02-19 92 views
3

所以我一直在環顧四周,沒有發現太多。我提前道歉,因爲這可能是這樣做的錯誤方式,但它是這樣。插入唯一的記錄到MS訪問2007年

所以我必須跟蹤同事已經完成的課程。這是通過提供MS訪問數據庫的Excel工作表完成的。有3個字段提供給我。

全名,課程名稱和完成日期。

我知道我沒有主鍵在這裏,所以我想創建一個查詢,只會追加從Excel表中拉出的獨特記錄。它基於一個單一的領域,但需要別人幫助我查詢追加它,只有當這兩個姓名和課程名稱都沒有,例如

Joe Somebody, Course#1, 14feb13

Joe Somebody, Course#2, 15feb13

Joe Somebody, Course#1, 15feb13

同我能做到

我需要一個查詢,將前兩行附加到表中,但由於已經完成課程#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。希望這有助於 – 2013-02-19 10:42:50

+0

它的確幫助我認爲我可以使用你的代碼很少調整訪問。非常感謝你! – divdeamor 2013-02-19 13:41:13

回答

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 

,如果你運行一個普通的追加查詢,建立與查詢設計窗口,你會如果記錄在Excel導入表中存在兩次或已經存在於訪問得到一個錯誤error on append

+0

而上述仍然允許多個相同的全名與不同的課程?反之亦然? – divdeamor 2013-02-19 13:39:44

+0

是的,只要這兩個字段的組合不同,它就會被允許。任何一個字段中的空值都將不被允許。 – Fionnuala 2013-02-19 13:43:40

+0

謝謝你。猜猜我沒有完全理解主鍵。我認爲主鍵會使每個字段都是獨一無二的,而不是將它們結合起來。再次感謝:) – divdeamor 2013-02-19 13:52:14

0

您實際上並不需要複合主鍵。實際上在Access中有幾個地方鼓勵您使用而不是使用複合主鍵。

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

這將給你輸入Excel表格中的每一行:

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

然後你可以從Excel文件中的所有數據吞掉:你可以用一個簡單的整數主鍵創建Access表一個唯一的編號並將其存儲在Access表中。現在您需要決定如何拒絕CourseCompletions表中的衝突行。 (以下查詢僅顯示您決定拒絕的而不是的記錄。)如果您希望在以後的日子拒絕由同一人同一門課程的完井:

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

如果你想早日拒絕完井簡單地改變最小到最大。

如果你要拒絕任何課程完成後,在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表格中,只需用MIN取代MAX。

因此,使用整數主鍵給你一些選項。