2017-03-09 241 views
0

我知道這已被多次詢問,但出於某種原因,解決方案對我而言並不適用。在Access中追加記錄時避免重複

數據庫佈局:

我有表1(Scanner_Location)誰獲得的數據從另一個表/子窗體拉到形式(掃描儀IBOB)*上舉行列:FP#,計數,地點,MODEL_ID,PK表3(Scanner_Model)保存顯示在子窗體中的最後一個數據列。(掃描程序詳細信息)保存三個數據列中的兩個:(FP#,Location PK-SN) 表3 (PK-Model_ID)

用戶將在窗體的一個部分輸入FP#和位置,然後導航到子窗體,並選擇多個模型,然後輸入計數(文本框)。一旦選定,他們點擊執行我的查詢的「更新」按鈕。 (其中我有一個更新,並附加查詢)

問題是,只是使用更新查詢不會添加記錄。使用追加查詢會創建現有數據的重複項。

這裏的流量如何進行:

用戶選擇模型1和模型2爲4的計數和100點擊次數更新的FP#。 查詢更新,並且信息正確輸入。

用戶再次選擇相同型號(Model_Select),具有相同的FP#和計數,Table1具有與另一個主鍵一樣再次輸入的相同信息。

目標:

追加查詢創建現有數據的副本。我只希望我的更新和/或追加查詢:

更新現有數據 - 尋找任何與同FP# 添加不存在任何記錄(在MODEL_ID和FP#看)

INSERT INTO Scanner_Location (Model_ID, FootPrints_Num, Location_ID, Scanner_Loc_Cnt) 
SELECT Scanner_Model.Model_ID, [Forms]![Scanner_IBOB]![fpNum_txt] AS [FP#], 
    [Forms]![Scanner_IBOB]![Location_Cbo_main] AS Location, 
    [Forms]![Scanner_IBOB]![Scanner_Loc_CntTxt] AS [Count] 
    FROM Scanner_Detail 
    RIGHT JOIN Scanner_Model ON Scanner_Detail.Model_ID = Scanner_Model.Model_ID 
    WHERE (((Scanner_Model.SM_Acc_Select)=True) 
     AND ((NOT Exists (SELECT * FROM Scanner_location 
    WHERE (((Forms!Scanner_IBOB!fpNum_txt)=Forms!Scanner_IBOB!fpNum_tx‌​t) 
     And ((Scanner_Model.SM_Acc_Select)=True));))=False)); 
+0

以上是我的追加查詢。 http://stackoverflow.com/questions/19837911/appending-into-another-table-and-avoiding-duplicates 讓我接近,但AND NOT EXISTS似乎沒有工作,或者我沒有正確理解它。 – Zdoghype

回答

0

沒有名爲'Update_SLoc_Acc53'的查詢 - 有'Update_SLoc_Acc3'和'Update_SLoc_Acc54'。我修改'Update_SLoc_Acc54',因爲它是由代碼調用的。

該查詢並未從組合框中拉出Location_ID。我發現綁定的列設置爲1,應該是0引用LOCATION_ID列,因爲列索引從0開始,可以通過設置寬度爲0

該查詢隱藏用戶此列似乎工作:

INSERT INTO Scanner_Location (Model_ID, FootPrints_Num, Location_ID, Scanner_Loc_Cnt) 
SELECT Scanner_Model.Model_ID, [Forms]![Scanner_IBOB]![fpNum_txt] AS FPNum, 
     [Forms]![Scanner_IBOB]![Location_Cbo_main] AS Location, 
     [Forms]![Scanner_IBOB]![Scanner_Loc_CntTxt] AS CountMod 
FROM Scanner_Model 
WHERE (((Scanner_Model.SM_Acc_Select)<>False) 
    AND (([Model_ID] & [Forms]![Scanner_IBOB]![fpNum_txt] & 
     [Forms]![Scanner_IBOB]![Location_Cbo_main]) 
     NOT IN (SELECT Model_ID & Footprints_Num & Location_ID FROM Scanner_Location))); 

注意我沒有在字段名稱中使用#。建議不要在名稱中使用標點符號/特殊字符,只有下劃線除外。還使用CountMod而不是Count作爲字段名稱。

爲什麼要求選擇兩個模型?如果一個被添加而另一個不是?

我有關於數據庫結構的擔憂。

  1. 不要認爲App_Location和App_Detail都應鏈接到其他表。爲什麼Location_ID是App_Location中的主鍵以及Location_Data中的主鍵?這是一對一的關係。
  2. 是Serial_Number掃描儀的序列號?爲什麼它是Telnet的主鍵?這也導致了1對1的關係,在這種情況下可能會將它們組合起來。
  3. 如果某個應用與掃描器相關聯,且掃描器與位置關聯,則不需要與應用關聯的位置。掃描儀和遠程登錄也一樣。
  4. Scanner_Location表未鏈接任何內容。如果此表的目的是跟蹤模型/足跡/位置的數量 - 正如已經建議的那樣,這通常不是一個好主意。理想情況下,計數數據應在需要信息時通過原始數據記錄的彙總查詢來計算。
+0

從頂部: 感謝您注意到查詢並未拉動位置,我一直在使用位置0作爲測試數據進行測試。而且我不知道綁定的列。 我有'#'作爲字段名稱的地方嗎?如果是這樣,它只是一個標籤?或者你是否將一個名爲「Number」的東西稱爲表單對象?我需要知道,以便我可以在我的數據庫副本中修改此內容。我將修復'數'參考。謝謝。 – Zdoghype

+0

如果選擇了一個模型,而沒有選擇其他模型,那很好。一個選項卡選擇掃描儀,另一個選項卡顯示可能隨基本裝置一起發貨的配件。 (如電池組或碼頭) 爲什麼應用程序位置和應用程序詳細信息要鏈接到其他表?我正在跟蹤應用程序,它們在哪裏使用以及應用程序是什麼。位置ID不應複製此信息,因此是此表的主鍵。應用程序名稱也作爲掃描儀通過掃描儀添加。 (將此視爲聯繫人數據庫的州名) – Zdoghype

+0

Serial_Number是掃描儀的序列號。是的,爲什麼它是Telnet的主鍵?我試圖分離出Telnet的數據。我不希望Scanner_Detail爲掃描儀保存所有東西。 (如果這是做錯誤的方法,請告訴我。)但是,我仍然在研究Telnet - 因爲我不完全確定該表格將使用哪些確切的信息。如果它只是一個數字,我當然會把它放在Scanner_Detail中。 – Zdoghype

0

也許使用NOT IN,是這樣的:

[一些標識符字段] NOT IN(SELECT [一些標識符字段] FROM

評論EXISTS vs IN

+0

經過大量的......試錯我有以下幾點:! 'INSERT INTO Scanner_Location(MODEL_ID,FootPrints_Num,LOCATION_ID,Scanner_Loc_Cnt) SELECT Scanner_Model.Model_ID,[表格] [Scanner_IBOB] [fpNum_txt] AS ([[Forms]![Scanner_IBB]! Scanner_IBOB]![FPNum_txt])AND(Scanner_Model.SM_Acc_Select = TRUE)) SELECT SM_ACC_SELECT,FPNum_txt FROM Scanner_Model WHERE SM_ACC_SELECT和FootPrints_Num([窗體]![Scanner_IBOB]![FPNum_txt]) ); ' – Zdoghype

+0

「Where There Exists」後面存在語法錯誤 – Zdoghype

+0

這沒有意義:([Forms]![Scanner_IBOB]![FPNum_txt])AND(Scanner_Model.SM_Acc_Select = True))。第二個子查詢中的WHERE子句也不例外。如果「計數」字段用於存儲彙總值,這不是一種好的做法。應在需要時計算聚合數據,而不是存儲。如果您想提供某些樣本數據,將會有所幫助。計數是Access中的保留字,應避免保留字作爲任何名稱。 – June7

0

考慮以下調整追加查詢在Scanner_Location檢查匹配MODEL_IDFP_Num的存在。如果匹配不存在,則查詢導入選定的記錄,因爲它們是新記錄而不是重複的。此外,表別名用於可讀性和子查詢相關性。

INSERT INTO Scanner_Location (Model_ID, FootPrints_Num, Location_ID, Scanner_Loc_Cnt) 
SELECT m.Model_ID, [Forms]![Scanner_IBOB]![fpNum_txt] AS [FP#], 
     [Forms]![Scanner_IBOB]![Location_Cbo_main] AS Location, 
     [Forms]![Scanner_IBOB]![Scanner_Loc_CntTxt] AS [Count] 
FROM Scanner_Detail d 
RIGHT JOIN Scanner_Model m ON d.Model_ID = m.Model_ID 
WHERE ((m.SM_Acc_Select = True) 
    AND (NOT EXISTS (SELECT 1 FROM Scanner_Location loc 
        WHERE ((loc.FootPrints_Num = Forms!Scanner_IBOB!fpNum_tx‌​t) 
         AND (loc.Model_ID = m.Model_ID)))));