MS Access 2007更新/插入或合并或联合

时间:2012-06-10 16:54:56

标签: sql ms-access-2007 sql-update union

我一直在寻找如何做一些在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

我要做的就是将临时表附加到主表上,以便:

  1. 没有重复项(基于驱动器和日期)
  2. 如果临时表具有匹配的驱动器和日期以及更大的值,则会覆盖主表
  3. 如果行存在于临时表中但不存在于主表中,则会将其附加到主表的末尾。
  4. 结果将在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中的一个表。

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

1 个答案:

答案 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

或者有关于。这是你的意思吗?