假设 SQL 表中有 3 列: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 in (
SELECT employee FROM my_table GROUP BY employee HAVING count(*) = 1)
如果您想以较小的块进行,您可以执行以下操作:
DELETE FROM my_table
WHERE employee in (
SELECT employee FROM my_table GROUP BY employee HAVING count(*) = 1 LIMIT <number_of_rows>)
这在 PostgreSQL 中有效——我对其他 RDBMS 中的
HAVING
语法了解不够