如何根据时间范围连接将字段从一个表更新到另一个表?

时间:2014-09-17 03:46:09

标签: sql date ms-access range

我尝试了很多不同的东西,但我真的在努力解决这个问题。我已经习惯了MySQL,SQLite和其他数据库,但我似乎无法在Access中找到这个。

如果table1的时间戳落在table2中按ID分组的时间戳范围内,我想要加入两个表。请参阅以下内容:

表1:

ID  Timestamp
    8:00 AM
    8:01 AM
    8:02 AM
    8:03 AM
    8:04 AM
    8:05 AM
    8:06 AM
    8:07 AM
    8:08 AM
    8:09 AM
    8:10 AM
    8:11 AM
    8:12 AM
    8:13 AM
    8:14 AM
    8:15 AM
    8:16 AM
    8:17 AM
    8:18 AM
    8:19 AM

表2:

ID  Timestamp
1   8:00 AM
1   8:02 AM
1   8:04 AM
1   8:06 AM
2   8:10 AM
2   8:12 AM
2   8:14 AM
2   8:16 AM

我想在Table1中发生什么:

ID  Timestamp
1   8:00 AM
1   8:01 AM
1   8:02 AM
1   8:03 AM
1   8:04 AM
1   8:05 AM
1   8:06 AM
    8:07 AM
    8:08 AM
    8:09 AM
2   8:10 AM
2   8:11 AM
2   8:12 AM
2   8:13 AM
2   8:14 AM
2   8:15 AM
    8:16 AM
    8:17 AM
    8:18 AM
    8:19 AM

这是我最初尝试过的(并希望能够工作),但经历了不同查询的多次迭代而没有任何问题。

UPDATE Table1 
  SET Table1.ID = Table2.ID 
  WHERE Table1.Timestamp IN (SELECT Table2.Timestamp GROUP BY Table2.ID);

我得到没有输出(Table1.ID保持为空)或者我得到错误“操作必须使用可更新的查询”。

1 个答案:

答案 0 :(得分:1)

您需要创建临时表并将其用作临时记录集以用于搜索记录。原因是您需要每个ID的最小/最大时间戳,这需要聚合查询,而不能在更新查询中使用。

SELECT Table2.ID, 
Min(Table2.TS) AS MinOfTS, 
Max(Table2.TS) AS MaxOfTS
 INTO try      '<- this is your temporary table.
FROM Table2
GROUP BY Table2.ID;

现在我们有了可以在临时表中搜索的值,我们可以在UPDATE语句中引用它。

UPDATE Table1, try SET Table1.ID = [try].[ID]
WHERE (((Table1.TS) Between [try].[minofts] And [try].[maxofts]));

编辑:我想你可以使用DLookup - 但与此方法相比,它们往往运行得非常慢。