首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何优化此sql delete语句

问如何优化此sql delete语句
EN

Stack Overflow用户
提问于 2011-09-22 23:06:50
回答 4查看 1.6K关注 0票数 1

我有3个表,第一个是table1,主键是id列,第二个表(table2)是作为外键引用table1.id的列table1_id,第三个表(table3)是table2,是作为外键引用table1.id的列table1_id。

我必须从table1中删除表1.id既不在table2.table1_id中也不在table3.table1_id中的所有行

现在我使用这个查询:

代码语言:javascript
复制
DELETE FROM table1
WHERE  table1.id IN (SELECT table1.id
                     FROM   (table2
                             RIGHT OUTER JOIN table1
                               ON table2.table1_id = table1.id)
                            LEFT OUTER JOIN table3
                              ON table3.table1_id = table1.id
                     WHERE  table2.table1_id IS NULL
                            AND table3.table1_id IS NULL);  

但是它非常慢,需要很多时间,有没有更好的方法来处理这个delete语句呢?

如果这可以帮助我,我可以假设table2比table3有更多的数据。

我使用的数据库是Apache Derby。

谢谢你的帮助。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-09-22 23:11:39

假设您已经了解了显而易见的内容(为table1.id、table2.table1_id和table3.table1_id创建的索引),您不需要仅仅为了测试键是否在另一个表中而执行完全的外连接,您可以使用子查询和exists() --或者在本例中使用not exists()。

由于您只测试是否存在,因此可以使用以下模式:

代码语言:javascript
复制
where not exists ( select top 1 1 from... where... )
票数 1
EN

Stack Overflow用户

发布于 2011-09-22 23:17:18

代码语言:javascript
复制
DELETE     table1
FROM       table1
LEFT JOIN  table2 ON table1.id = table2.table1_id
LEFT JOIN  table3 ON table1.id = table3.table1_id
WHERE table2.table1_id IS NULL
  AND table3.table1_id IS NULL
票数 1
EN

Stack Overflow用户

发布于 2011-09-22 23:16:04

代码语言:javascript
复制
DELETE from table1
WHERE 
   table1_id NOT IN (SELECT table1_id FROM table2)
   AND
   table1_id NOT IN (SELECT table1_id FROM table3)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7517049

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档