【问题标题】:MS Access 2007 update/insert or merge or unionMS Access 2007 更新/插入或合并或联合
【发布时间】:2012-06-11 02:23:06
【问题描述】:

我一直在寻找如何做一些在 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. 如果该行存在于临时表中但不存在于主表中,则将其附加到主表的末尾。

结果将在 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 操作的一部分执行。

这是一个sn-p

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 来更新联合中的一张表。

任何意见将不胜感激。谢谢。

【问题讨论】:

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


    【解决方案1】:

    似乎匹配在驱动器、类型和日期上,所以对于新记录,也许:

    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
    

    或者差不多。这是你的意思吗?

    【讨论】:

    • Remou,那应该做我想做的。我使用的查询的布局与您显示的略有不同。我明天试试这个。我遇到的一个问题是我使用 items_moved.file_date Is Null 并且它没有返回任何结果。我试试你的方法。感谢您的及时回复。
    • 雷穆。经过一些修改以适应我的确切设置,这个解决方案运行良好。非常感谢,非常感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多