我们的数据库中有逻辑删除,每个表都有一个“已删除”标志,这是一个可以为空的日期时间字段。
Deleted DATETIME NULL
在我们的查询中,我使用以下模式:
SELECT *
FROM TableA a
INNER JOIN TableB b
ON b.id = a.pkid
AND b.deleted IS NULL
INNER JOIN TableC c
ON c.id = b.pkid
AND c.deleted IS NULL
WHERE a.deleted IS NULL
是否比以下更有效:
SELECT *
FROM TableA a
INNER JOIN TableB b
ON b.id = a.pkid
INNER JOIN TableC c
ON c.id = b.pkid
WHERE a.deleted IS NULL
AND b.deleted IS NULL
AND c.deleted IS NULL
我知道当左连接进入它时,父母会改变。我在这里谈论的是 INNER 加入。
我认为第一个更有效,因为服务器执行查询的方式。我找不到我看到的有关阶段的页面...即首先是联接,然后是位置,然后是订单,然后是选择...但是第一个示例会限制数据,然后触发位置,所以 WHERE 覆盖的数据更少?