我的最终目标... SELECT家用电话,手机或办公电话与qry1匹配的行中tbl2中的所有字段

这是我当前“失败”的SQL语法。通过失败,我的意思是10到15分钟后执行还没有完成,而每个人(独立地)加入的时间都在一到两分钟内。

SELECT qry1.* FROM qry1 INNER JOIN tbl2 ON ((qry1.CellPhone = tbl2.CellPhone) OR (qry1.HomePhone = tbl2.HomePhone) OR (qry1.WorkPhone = tbl2.WorkPhone));

问题:
我的SQL语法是否有错误?
有更好的方法来完成我的任务吗?
对我来说,简单地独立运行3个(家庭,工作,单元格)JOIN查询,然后对它们进行UNION,然后在必要时进行重复数据删除是否更有意义?

最佳答案

如果单个联接的工作速度很快,则复合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,但是如果两个表中有很多行,其中两对或三对字段匹配,则可能导致结果重复很多。

10-07 12:26