我有这种删除查询:
DELETE
FROM SLAVE_TABLE
WHERE ITEM_ID NOT IN (SELECT ITEM_ID FROM MASTER_TABLE)
有没有办法优化这个?
答案 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