如何删除数据库中的特定条目?

问题描述 投票:0回答:1

假设表中有三列: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;

脚本卡住了,可能是因为数据库太大?

sql firebird firebird2.5
1个回答
0
投票

您的

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
都会返回尚未删除的项目)

© www.soinside.com 2019 - 2024. All rights reserved.