首页 > 解决方案 > 无法在 MS Access 上使用 NOT EXISTS 删除所有不在前 20 名中的行

问题描述

我在一个名为 Scores 的表中有游戏的最高分。我想要做的是“删除所有不是所有时间前 20 天和 365 天前 20 天的所有分数”,以减少数据库大小。但是,我的查询似乎不起作用和/或有语法错误。

我正在使用 MS Access .mdb 文件和 asp.net c# windows 窗体来执行此查询。

DELETE FROM
  Scores
WHERE
  NOT EXISTS (
    SELECT
      TOP 20 *
    FROM
      Scores
    ORDER BY
      Points Desc
  )
  AND NOT EXISTS (
    SELECT
      TOP 20 *
    FROM
      Scores
    WHERE
      DateDiff("d", Date, NOW()) <= 365
    ORDER BY
      Points Desc
  )

我的查询似乎没有删除任何低分。

标签: sqlms-access

解决方案


如果你的表中有一个唯一的主键,比如 id,你可以这样做:

DELETE FROM SCORES
WHERE
ID NOT IN (
   SELECT TOP 20 ID 
   FROM Scores
   ORDER BY Points DESC)
OR 
ID NOT IN (
    SELECT TOP 20 ID
    FROM  Scores
    WHERE
        DateDiff("d", Date, NOW()) <= 365
    ORDER BY Points Desc)

请注意,我使用OR而不是AND,因为:
(NOT IN A) OR (NOT IN B)相当于NOT ((IN A) AND (IN B))


推荐阅读