1

微软访问 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

4 回答 4

1

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

VBA 不是进行子查询的最佳场所。

于 2012-07-25T18:06:01.110 回答
0

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

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

其中“THIS WEEK - 4 WEEKS”是一个相关表达式,表示您要删除行之前的结束日期。

于 2012-07-24T14:29:43.843 回答
0

我需要做的是从表中删除 4 周或更早的任何内容。

你能不能做类似的事情: -

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

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

于 2012-07-24T15:05:38.507 回答
0

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

于 2012-07-24T15:33:43.353 回答