MS Access:“Not In”无法正常工作

时间:2012-07-24 14:24:48

标签: sql ms-access subquery

MS ACCESS SQL

DELETE * 
FROM Lane_Details
WHERE Lane_Details.Week not in(SELECT DISTINCT TOP 3 Lane_Details.Week
           FROM Lane_Details
WHERE Lane_Details.Week IS NOT NULL
ORDER BY Week DESC; )

渴望成果

我需要做的是删除4周或更长时间的表格。

我在使用not in时遇到了麻烦。它导致Access完全锁定。我不知道对于这个应该是什么样的正确语法,我知道我可以使用左外连接编写它但我不知道该怎么做。

数据

ID            Lane  Time                        Week
6213214 83198524    4/6/2012 12:31:00 AM    201315
6213183 61780698    4/6/2012 12:31:00 AM    201311
6213201 11145552    4/6/2012 12:31:00 AM    201315
6213202 82391025    4/6/2012 12:31:00 AM    201314
6213203 11149012    4/6/2012 12:31:00 AM    201311
6213204 11140048    4/6/2012 12:31:00 AM    201311
6213205 83198524    4/6/2012 12:31:00 AM    201316
6213207 61625652    4/6/2012 12:31:00 AM    201316
6213210 61625652    4/6/2012 12:31:00 AM    201311
6637195 36166433    5/1/2012 8:25:00 AM           201314
6637206 77222091    5/1/2012 10:50:00 AM    201314

有了这些数据,我想删除任何有一周201311的行。我想保留201314,201315和201316。

子查询将在此表上运行,并在这种情况下获取前3个日期(14,15,16)。然后我说“不在”删除所有11个。

4 个答案:

答案 0 :(得分:1)

感谢所有帮助。我终于意识到这不是我的查询,它只是运行得很慢。我认为这是一个性能问题。我决定将查询分解为几个不同的查询。它现在好多了。我最终找到了this网站并得出了这个结论。

VBA不是进行子查询的最佳位置。

答案 1 :(得分:0)

我不确定Access在删除时如何处理WHERE子句中的自引用。但是你可以做这样的事情来避免子查询:

DELETE FROM Lane_Details
WHERE Week <= (THIS WEEK - 4 WEEKS)

本周&#34;本周 - 4周&#34;是表示要删除行的结束日期的相关表达式。

答案 2 :(得分:0)

  

我需要做的是删除4周或更长时间的表格。

你能不能这样做: -

DELETE * FROM Lane_Details where Week<=datepart("yyyy",dateadd("w",-4,now())) & datepart("ww",dateadd("w",-4,now()))

您可能需要将Week转换为字符串,但这样才能解决问题。

答案 3 :(得分:0)

请删除子查询中的分号,并在周字段上创建索引。查询应该可以正常工作。