使用父 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 服务器。
我有以下两个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 服务器。