2016-07-28 66 views
0

我有两个表:newparts,storedpartsMS访问SQL加入子查询

我插入newparts,这是不是在storedparts喷入storedparts的部分:

SQL_String = "INSERT INTO storedparts " & _ 
      "SELECT newparts.* " & _ 
      "FROM storedparts " & _ 
      "RIGHT JOIN newparts ON (storedparts.identifier = newparts.identifier) AND (storedparts.timeStamp = newparts.timeStamp) " & _ 
      "WHERE ((storedparts.AutoID) Is Null);" 

这是工作的罚款至今。现在的问题:表storedparts变得如此之大,程序对于连接过程来说太长了。我的解决方案:只是比较newparts不是存储的部分的所有部分,但只是部分不超过4天...我尝试了这样的子查询,但我不能让它运行。

SQL_String = "INSERT INTO storedparts " & _ 
      "SELECT newparts.* " & _ 
      "FROM storedparts (WHERE storedparts.timestamp > Now() - 4) " & _ 
      "RIGHT JOIN newparts ON (storedparts.identifier = newparts.identifier) AND (storedparts.timeStamp = newparts.timeStamp) " & _ 
      "WHERE ((storedparts.AutoID) Is Null);" 

任何帮助表示赞赏。

+2

为什么'RIGHT JOIN'?如果真的需要外部连接,切换表并执行'LEFT JOIN'。大多数人觉得那些人很难理解,而且加入的方式更加混乱。 (更容易理解“主表左连接可选数据”而不是“可选数据右连接主​​表”)。 – jarlh

回答

0

如果你的表有索引,这将不是问题。

CREATE INDEX ndx_sp_identifier ON storedparts (identifier); 
CREATE INDEX ndx_np_identifier ON newparts (identifier); 

然后,我建议你改变你的查询,像@jarlh指出的那样。

INSERT INTO storedparts 
SELECT newparts.* 
FROM newparts 
LEFT JOIN storedparts 
ON newparts.identifier = storedparts.identifier 
AND newparts.timeStamp = storedparts.timeStamp 
WHERE storedparts.AutoID Is Null; 
0

您可以在连接语句之后添加where子句并查看它是否改进了查询的性能。否则试试看看它是否有效

SQL_String = "INSERT INTO storedparts " & _ 
      "SELECT newparts.* " & _ 
      "FROM (SELECT * FROM storedparts WHERE 
       storedparts.timestamp > DateAdd ('d', -4, Now()))sparts" & _ 
      "RIGHT JOIN newparts ON (sparts.identifier = newparts.identifier) AND 
      (sparts.timeStamp = newparts.timeStamp) " & _ 
      "WHERE ((sparts.AutoID) Is Null);"