在进行INNER JOIN时使用SQlite删除值

时间:2013-09-10 01:22:39

标签: sql sqlite join sql-delete

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

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

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语句删除时都会收到错误

2 个答案:

答案 0 :(得分:7)

您可以将其标记为delete并带有where子句:

delete from voters
    where votes.party not in ('democrat', 'republican') and
          voters.id in (select id from votes group by id having count(*) = 1);

答案 1 :(得分:4)

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

delete语句的语法是“DELETE FROM table WHERE conditions”。表值必须是数据库中三个表中的一个,并且您的目标是选民。截至目前,您已完成一半的删除声明。

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

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 )