【问题标题】:Delete all rows except the results from a given query删除除给定查询的结果之外的所有行
【发布时间】:2015-08-26 21:14:23
【问题描述】:

我有两个模型 A 和 B 以及一个关系表 ab。

此查询显示关系表中的所有有效条目

select *
from ab
join a on (ab.a=a.id)
join b on (ab.b=b.id)
where a.pid=b.pid

我怎样才能删除所有无效条目,所以除了通过上述查询找到的条目之外的所有条目?

【问题讨论】:

  • 您是否要从表ab 中删除无效行?

标签: mysql sql sql-delete


【解决方案1】:
delete from a
where id not in
(
    select * from 
    (
      select a.id
      from ab
      join a on (ab.a=a.id)
      join b on (ab.b=b.id)
      where a.pid=b.pid
    ) x
);

delete from b
where id not in
(
    select * from 
    (
      select b.id
      from ab
      join a on (ab.a=a.id)  
      join b on (ab.b=b.id)
      where a.pid=b.pid
    ) x
);

delete ab from ab
left join a on ab.a = a.id
left join b on ab.b = b.id
where a.pid <> b.pid
or a.id is null 
or b.id is null;

SQLFiddle demo

【讨论】:

  • 现在表 ab 已清理,但 ab 表中可能仍存在无效条目。您会将其添加到您的答案中吗?
  • 我添加了ab 清理。
  • 您的 ab 清理不遵守 a.pid 在我的查询中必须匹配 b.pid 的条件。我仍然有两个都不为空但它们的 pid 不匹配的条目
  • @Conic:好的,我添加了。
  • 前两个查询在 MySQL 中不起作用 - 您不能在 FROM 子句中指定目标表。您需要将查询结果放入临时表中,然后在删除语句中引用它。
【解决方案2】:

假设您要删除无效关系,可能在 DELETE 中使用一对 LEFT JOIN:-

DELETE ab
FROM ab
LEFT OUTER JOIN a ON ab.a = a.id
LEFT OUTER JOIN b ON ab.b = b.id
WHERE a.id IS NULL
OR b.id IS NULL

如果您还需要清理其他 2 个表,则应该执行以下 2 个查询:-

DELETE a
FROM a
LEFT OUTER JOIN ab ON a.id = ab.a
WHERE ab.a IS NULL


DELETE b
FROM b
LEFT OUTER JOIN ab ON b.id = ab.b
WHERE ab.b IS NULL

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-02
    • 2010-11-26
    • 1970-01-01
    • 2010-12-17
    • 2021-12-30
    • 2015-06-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多