1

我一直在寻找如何做一些在 MS Access 2007 中应该很容易做的事情。

我有一个主表 items_moved,它按类型、按天跟踪收到的文件数。基本结构是:

ID(自动编号)、驱动器(文本)、类型(文本)、日期(DateTime)、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. 如果该行存在于临时表中但不存在于主表中,则将其附加到 main 的末尾。

结果将在 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 表中日期不匹配的行,因此无法运行插入。

最后一点是当用户从访问数据库请求报告时,将其作为 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 更新联合中的一张表的信息。

任何输入将不胜感激。谢谢。

4

1 回答 1

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

或者那里。你是这个意思吗?

于 2012-06-10T18:23:06.060 回答