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个。
答案 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)
请删除子查询中的分号,并在周字段上创建索引。查询应该可以正常工作。