如何在Firebird中优化DELETE .. NOT IN .. SUBQUERY

时间:2012-09-15 21:16:44

标签: subquery firebird sql-delete

我有这种删除查询:

DELETE 
FROM SLAVE_TABLE
WHERE ITEM_ID NOT IN (SELECT ITEM_ID FROM MASTER_TABLE)

有没有办法优化这个?

2 个答案:

答案 0 :(得分:3)

通常可以使用(NOT) IN来优化

(NOT) EXISTS

DELETE 
FROM SLAVE_TABLE
WHERE NOT EXISTS (SELECT 1 FROM MASTER_TABLE M WHERE M.ITEM_ID = ITEM_ID)

我不确定你在这里尝试做什么,但对我来说这个查询表明你应该使用外键来强制执行这些约束,而不是运行查询来清理后来的混乱。

答案 1 :(得分:2)

您可以使用EXECUTE BLOCK顺序扫描详细信息表并删除没有匹配主记录的记录。

EXECUTE BLOCK
AS
  DECLARE VARIABLE C CURSOR FOR
    (SELECT d.id
     FROM detail d LEFT JOIN master m
       ON d.master_id = m.id
     WHERE m.id IS NULL);
  DECLARE VARIABLE I INTEGER;
BEGIN
  OPEN C;
  WHILE (1 = 1) DO
  BEGIN
    FETCH C INTO :I;
    IF(ROW_COUNT = 0)THEN
      LEAVE;
    DELETE FROM detail WHERE id = :I;
  END
  CLOSE C;
END