我的最终目标...SELECT
来自 qry1
的所有字段,位于家庭电话、手机或工作电话匹配 tbl2
的行上>
这是我当前“失败”的 SQL 语法。失败是指它在 10 到 15 分钟后尚未完成执行,而个人加入每个(独立)运行一两分钟。
选择 qry1.*
FROM qry1 内部联接 tbl2
开((qry1.CellPhone = tbl2.CellPhone)
或 (qry1.HomePhone = tbl2.HomePhone)
或 (qry1.WorkPhone = tbl2.WorkPhone));
问题: 我的 SQL 语法有错误吗? 有没有更好的方法来完成我的任务? 对我来说,简单地独立运行 3 个(家庭、工作、单元)JOIN 查询,将它们联合起来,然后在必要时进行重复数据删除是否更有意义?
最佳答案
如果单个连接工作得很快,那么复合 OR 条件可能会很慢,因为它不能使用单个索引,而单个条件可以对三个连接条件使用单个索引。因为它不能使用一个索引,它很可能是在进行非索引顺序表扫描。 (您应该研究查询计划,以便了解优化器实际在做什么。)
鉴于各个查询的运行速度相当快,因此,您应该使用 UNION 获得更好的性能(除非您的 DBMS 中的优化器存在盲点):
SELECT qry1.* FROM qry1 INNER JOIN tbl2 ON qry1.CellPhone = tbl2.CellPhone
UNION
SELECT qry1.* FROM qry1 INNER JOIN tbl2 ON qry1.HomePhone = tbl2.HomePhone
UNION
SELECT qry1.* FROM qry1 INNER JOIN tbl2 ON qry1.WorkPhone = tbl2.WorkPhone
这应该与 3 个单独的查询一样快地为您提供结果。它不会那么快,因为 UNION 确实进行了重复消除(当然,单个查询不会)。您可以使用 UNION ALL,但如果两个表中有很多行,其中 2 或 3 对字段匹配,则可能会导致结果中出现大量重复。
关于sql - 如果多个条件之一为真,我如何执行 JOIN?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27696625/