我有3个表,第一个是table1,主键是id列,第二个表(table2)是作为外键引用table1.id的列table1_id,第三个表(table3)是table2,是作为外键引用table1.id的列table1_id。
我必须从table1中删除表1.id既不在table2.table1_id中也不在table3.table1_id中的所有行
现在我使用这个查询:
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。
谢谢你的帮助。
发布于 2011-09-22 23:11:39
假设您已经了解了显而易见的内容(为table1.id、table2.table1_id和table3.table1_id创建的索引),您不需要仅仅为了测试键是否在另一个表中而执行完全的外连接,您可以使用子查询和exists() --或者在本例中使用not exists()。
由于您只测试是否存在,因此可以使用以下模式:
where not exists ( select top 1 1 from... where... )发布于 2011-09-22 23:17:18
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发布于 2011-09-22 23:16:04
DELETE from table1
WHERE
table1_id NOT IN (SELECT table1_id FROM table2)
AND
table1_id NOT IN (SELECT table1_id FROM table3)https://stackoverflow.com/questions/7517049
复制相似问题