2012-06-10 60 views
1

我一直在尋找了好一會兒怎麼做的東西,應該是很容易在MS Access做2007MS Access 2007的更新/插入或合併或聯合

我有一個主表,items_moved,它按類型跟蹤每天收到的文件數量。的基本結構是:

ID(自動編號),驅動器(文本),類型(文字),日期(日期時間),FILE_COUNT(號碼),FILE_SIZE(數字)

典型數據看起來像:

1777, F:\snaps, pics, 6/09/2010, 66, 151616131 
1778, F:\snaps, pics, 6/10/2010, 5, 464864 
1779, G:\pics, pics, 6/09/2010, 58, 45645646 
1780, G:\pics, pics, 6/10/2010, 70, 123456667 

我有一個完全相同的數據結構的臨時表。臨時表是通過從items_moved表的最後一天開始(包括)並查找新內容來生成的。

典型的數據是這樣的:

1, F:\snaps, pics, 6/10/2010, 366, 6531616131 
2, F:\snaps, pics, 6/11/2010, 5, 464864 
3, G:\pics, pics, 6/10/2010, 70, 123456667 
4, G:\pics, pics, 6/11/2010, 56, 123645964 

所有我想要做的是附加在主表的臨時表,以便:

  1. 有沒有重複的(基於驅動器

    和日期)
  2. 如果臨時表具有匹配的驅動器和日期和更大的值,則會覆蓋主表
  3. 如果該行存在於臨時表中但不存在於主表中,那麼它會ts附加到主的末尾。

結果將在items_moved表,將記錄1-1776不變,但現在這樣結束:

1777, F:\snaps, pics, 6/09/2010, 66, 151616131   (Unchanged) 
1778, F:\snaps, pics, 6/10/2010, 366, 6531616131  (Updated temp was larger) 
1779, G:\pics, pics, 6/09/2010, 58, 45645646   (unchanged) 
1780, G:\pics, pics, 6/10/2010, 70, 123456667   (unchanged) 
1781, F:\snaps, pics, 6/11/2010, 5, 464864    (added) 
1782, G:\pics, pics, 6/11/2010, 56, 123645964   (added) 

我已經試過加入,我能想到的每一個變化。

我可以得到具有匹配日期的行,所以我可以用它來更新語句。我無法從temp中獲取items_moved表中沒有匹配日期的行,因此我無法運行插入。

最後一點是當用戶從訪問數據庫請求報告時,將其作爲VB操作的一部分執行。

這裏有一個片斷

INSERT INTO items_moved (drive, type, file_date, file_count, file_size) 
SELECT 'F:\snaps','pics', temp_table.created, Count(temp_table.created), 
    Sum(temp_table.size) FROM temp_table where temp_table.drive = 'F:\snaps' 
    GROUP BY temp_table.created 

這個工作,但只是增加了表的末尾。我留下了重複的問題。我敢肯定,有一種方法可以即時重複刪除表格,但這看起來很浪費。我發現在使用聯合時有一些提示,但如何使用聯合更新聯合中的某個表格沒有任何提示。

任何輸入,將不勝感激。謝謝。

回答

0

看來,這場比賽是驅動器,類型和日期,因此對於新的記錄,也許:

INSERT INTO items_moved (drive, type, file_date, file_count, file_size) 
SELECT t.drive, type, t.file_date, t.file_count, t.file_size 
FROM temp_table t 
LEFT JOIN items_moved m 
ON t.Drive = m.Drive AND t.Type = m.Type and t.file_date = m.file_date 
WHERE m.ID Is Null 

將需要更新的第二個查詢:

UPDATE items_moved m 
INNER JOIN temp_table t 
ON t.Drive = m.Drive AND t.Type = m.Type and t.file_date = m.file_date 
SET m.file_count = t.file_count, m.file_size = t.file_size 
WHERE m.file_size < t.file_size 

或有abouts 。你是這個意思嗎?

+0

雷若,應該做我想做的事情。我正在處理的查詢與您展示的佈局略有不同。我明天會試試這個。我遇到的一個問題是我使用了items_moved.file_date是Null,它沒有返回任何結果。我會嘗試你的方法。感謝您的及時迴應。 – Lindylead

+0

Remou。經過一些修改以適合我的確切設置,此解決方案運行良好。非常感謝,您的幫助非常感謝。 – Lindylead