WHERE 子句中未使用的列

lon*_*nix 6 postgresql sqlite query subquery relational-theory

我在我们的代码库中找到了这个查询:

DELETE FROM "Foo"
WHERE ("Foo"."Id", "Foo"."CreatedAt")
IN (SELECT "f"."Id", "f"."CreatedAt"
    FROM "Foo" AS "f"
    WHERE "f"."CreatedAt" <= CURRENT_TIMESTAMP);
Run Code Online (Sandbox Code Playgroud)

它删除当前时间之前创建的记录。

这给出了相同的结果:

DELETE FROM "Foo"
WHERE "Foo"."CreatedAt"
IN (SELECT "f"."CreatedAt"
    FROM "Foo" AS "f"
    WHERE "f"."CreatedAt" <= CURRENT_TIMESTAMP);
Run Code Online (Sandbox Code Playgroud)

我不知道为什么Foo.Id将 包含在WHERE子句中 - 也许是各种重构留下的垃圾(例如,它可能已用于批量删除ORDER BY "f"."Id" LIMIT 1000)。但因为这是一场PK,我不愿意删除它,因为也许它的存在是有原因的。

是否有理论/性能原因将其放在那里,或者这两个查询是否等效?

(这同时针对 postgres 和 sqlite。)

Lau*_*lbe 13

这两个查询都极其复杂。使用

DELETE FROM "Foo"
WHERE "CreatedAt" < current_timestamp;
Run Code Online (Sandbox Code Playgroud)