假设表中有三列:A、B 和 C。A 列中包含员工,B 列中包含条目日期,C 列中包含条目值。有些员工每天要输入 3 个条目,有些员工每天要输入 2 个条目,有些则只有 1 个条目。如果一名员工每天只有一个条目,那么要删除这些条目的 SQL 脚本是什么?
我使用的是 Firebird 2.5,因此并非所有最新命令都可用。
我正在尝试这个:
DELETE FROM my_table AS t1
WHERE (
SELECT COUNT(*)
FROM my_table AS t2
WHERE t1.employee = t2.employee AND t1.entry_date = t2.entry_date
) = 1;
脚本卡住了,可能是因为数据库太大?
您的
WHERE
子句基本上是 ...COUNT(*).... = 1
- 如果 COUNT(*)
翻译为 1
,那么您的 WHERE
子句就变成 WHERE 1=1
。这是危险的——基本上你是在指示数据库 DELETE
1 = 1 的所有行,这意味着你最终将删除表中的每一行,因为 1 始终等于 1。
我想你想要的是这样的:
DELETE FROM my_table
WHERE (employee, entry_date) in (
SELECT employee, entry_date FROM my_table GROUP BY employee, entry_date HAVING count(*) = 1)
这在 PostgreSQL 中有效——我对其他 RDBMS 中的
HAVING
语法了解不够
如果您想以较小的块进行,您可以执行以下操作:
DELETE FROM my_table
WHERE (employee entry_date) in (
SELECT employee, entry_date FROM my_table GROUP BY employee, entry_date HAVING count(*) = 1 LIMIT <number_of_rows>)
如果重复执行上述操作,最终将删除所有只有一个
employee
条目的行(因为每次调用它时,SELECT
都会返回尚未删除的项目)