sql - 无法在 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
)
我的查询似乎没有删除任何低分。
解决方案
如果你的表中有一个唯一的主键,比如 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))
推荐阅读
- php - 联系表单提交后的模态弹出窗口
- php - 如何使用 setlocale 将日期更改为西班牙语格式?
- operating-system - 为什么上下文没有保存在进程本身而不是PCB中?
- python-3.x - Jupiter Notebook 未连接到内核
- javascript - 如何删除二维数组的角索引?
- python - 用 _leftonly 或 _rightonly 的值填充合并在 2 列上的 Df 外部缺失值
- c++ - QT OpenSource,5.12.1,默认安装不产生 qtmainid.lib
- python - Cython Cimport 未解析的外部符号
- html - 图像 srcset 大小
- html - 用图像的响应高度划分图像,引导程序 4.3.1