我一直在寻找如何做一些在MS 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
我要做的就是将临时表附加到主表上,以便:
结果将在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)
我已经尝试了我能想到的每个联接变体。
我可以获得具有匹配日期的行,因此我可以将其用于更新语句。我无法从items_moved表中获取temp中没有匹配日期的行,因此无法运行插入。
最后一点是当用户从访问数据库请求报告时,将其作为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
这样可行,但只是添加到表的末尾。我留下了重复的问题。我确信有一种方法可以动态地重复表格,但这似乎是浪费。我发现了一些关于使用 union 的提示,但没有提到如何使用union来更新union中的一个表。
任何输入都将不胜感激。感谢。
答案 0 :(得分: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
或者有关于。这是你的意思吗?