将查询
WHERe移到实际联接中。这些称为相关子查询,是Voldemort的工作。如果它们是联接,则它们只会执行一次,从而可以加快查询速度。
对于这些
NOT IN部分,请使用左外部联接,并检查联接的列是否为
NULL。
另外,请尽可能避免
OR在
WHERe查询中使用-请记住,这
OR不一定是短路操作。
示例如下:
SELECt *FROM dbo.contacts AS cINNER JOIN dbo.contacts_def_jobfunctions AS jf ON c.JobTitle = jf.JobId AND jf.ParentJobID <> '1841'INNER JOIN dbo.contacts_link_emails AS e ON c.ContactID = e.ContactID AND jf.JobID = c.JobTitle LEFT JOIN dbo.newsletterremovelist AS rl ON e.Email = rl.EmailAddressWHERe rl.EmailAddress IS NULL
请不要使用它,因为它几乎可以肯定是不正确的(更不用说了
SELECT*),我已经忽略了contacts_ref_jobfunctions_3的逻辑以提供一个简单的示例。
对于(真正)关于联接的很好的解释,请尝试以下关于联接的直观解释



