使用父 table 从子 table 中删除不需要的记录

Delete unnecessary records from child table by using parent table

我有以下两个table,

tableA有,

primary key and a 
date field

tableB有,

id : primary
table1-id : primary key of tableA
val1,val2,val3 are used to store numerics.

在这里,对于 tableA 中的每个条目,我们在 tableB 中最多可以有两行。 但是由于一些问题,对于每 tableA 行,在 tableB 中插入了两条以上的记录。

我想在此处执行迁移任务以删除 tableB 中的所有额外条目。

我尝试编写程序,但有些无法执行所需的工作。

table如下,

任何帮助将不胜感激。

在 SQL-Server 中,您可以为此使用 row_number() 和可更新的通用 table 表达式:

with cte as (
    select row_number() over(partition by [table1-id] order by id) rn from tableB
)
delete from cte where rn > 2

您不需要涉及 parent table。只需将 child table 中具有相同 table1-id 的组中的记录按 id 排序,然后删除每条排名严格大于 2.[=14 的记录=]

根据您的评论,这似乎应该符合您的要求。它从 tableB 中删除所有条目,其中 3 个 val 值都是 -1 并且 id 值在 tableB 中至少有 3 个对应的行:

DELETE FROM tableB
WHERE val1 = -1 AND val2 = -1 AND val3 = -1
AND `table1-id` IN (SELECT `table1-id`
                    FROM tableB 
                    GROUP BY `table1-id`
                    HAVING COUNT(*) > 2)

在 MySQL 中解决

Error Code: 1093 You can't specify target table 'tableB' for update in FROM clause

问题,将子查询中的 tableB 替换为 (SELECT * FROM tableB) b

DELETE FROM tableB
WHERE val1 = -1 AND val2 = -1 AND val3 = -1
AND `table1-id` IN (SELECT `table1-id`
                    FROM (SELECT * FROM tableB) b
                    GROUP BY `table1-id`
                    HAVING COUNT(*) > 2)

此查询也适用于 SQL 服务器。