4

我试图从选民表中删除所有选民,他们没有登记为民主党或共和党,并且只投票过一次。我有一个包含三个表的数据库,即 congress_members、voters 和 votes,并且必须与选民一起投票才能删除正确的数据。

此代码找到我要删除的数据:

SELECT voters.*
FROM voters JOIN votes ON voters.id = votes.voter_id
WHERE party = 'green' OR party = 'na' OR party = 'independent'
GROUP BY votes.voter_id
HAVING COUNT(*) = 1;

但我无法删除它,因为每次尝试使用 JOIN 语句删除时都会出错

4

2 回答 2

8

您可以将其表述为deletewhere子句:

delete from voters
    where votes.party not in ('democrat', 'republican') and
          voters.id in (select id from votes group by id having count(*) = 1);
于 2013-09-10T01:25:17.347 回答
5

您收到错误是因为联接将查询您的数据库并创建一个临时表来保存您新查询的数据。删除语句用于删除存储在磁盘上的数据库中而不是内存中的数据。

删除语句的语法是“DELETE FROM table WHERE 条件”。表值需要是数据库中的三个表之一,并且您的目标是选民。截至目前,您已经完成了一半的删除语句。

where 子句需要为每一行计算一个布尔值。有一个函数叫做 EXISTS()。此功能可用于删除此数据。本质上,您会将您的帖子中的 select 语句放在 EXISTS () 中。该函数会将目标删除表中的每一行与存在的表中的一行进行比较。如果匹配,则该行存在,该函数对该行的计算结果为真,并将其删除。

DELETE FROM voters WHERE (party = 'green' OR party = 'na' OR party = 'independent') AND EXISTS ( SELECT 1 FROM votes WHERE votes.id = voters.id HAVING COUNT(*) = 1 )

于 2013-09-10T01:53:56.137 回答