简体   繁体   English

在 PostgreSQL 中添加 LIMIT 以使用 LEFT JOIN 和 DELETE 进行查询

[英]Add LIMIT to query with LEFT JOIN and DELETE in PostgreSQL

I'm trying to delete data from a table that has about 12 million records, wanting to delete it in batches but you can't use LIMIT with DELETE in sql, I'm a bit stumped on how to get around it.我正在尝试从一个有大约 1200 万条记录的表中删除数据,想批量删除它但是你不能在 sql 中使用 LIMIT 和 DELETE,我对如何解决它有点困惑。

The query without LIMIT is:没有 LIMIT 的查询是:

DELETE FROM roster_validationtaskerror
USING roster_validationtaskerror AS rvte
LEFT JOIN roster_validationtask AS rvt ON rvt.id = rvte.parent_task_id
LEFT JOIN roster_validation AS rv ON rv.id = rvt.validation_id
WHERE rv.id = 10

How can I add a LIMIT to this query?如何向此查询添加 LIMIT?

I've been trying to add subselect queries to allow for the LIMIT to be added within this and then a JOIN made after.我一直在尝试添加子选择查询以允许在此范围内添加 LIMIT,然后再进行 JOIN。 I'm quite new to SQL so have not been able to figure out how to get this to work.我是 SQL 的新手,所以一直无法弄清楚如何让它工作。

Try this:试试这个:

WITH r AS (
    SELECT rvte.id 
    FROM roster_validationtaskerror AS rvte
    JOIN roster_validationtask AS rvt ON rvt.id = rvte.parent_task_id
    JOIN roster_validation AS rv ON rv.id = rvt.validation_id
    WHERE rv.id = 10
    -- perhaps order by is needed if you want to delete not randomly selected rows
    LIMIT 10
)
DELETE FROM roster_validationtaskerror
USING r
WHERE r.id = roster_validationtaskerror.id

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM