sql - 如果多个条件之一为真,我如何执行 JOIN?

标签 sql ms-access ms-access-2010

我的最终目标...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/

相关文章:

sql - 操作必须使用可更新的查询 ASP 查询失败

sql - 如何合并两个sql查询?

vba - 将列表框复制到另一个列表框

ms-access - 如何使用 VBA 创建 CurrentDb 的副本

php - 如果名称不存在,则将名称插入表中

MySQL:如何将列别名与特定的 JOIN 子句相关联

sql - Oracle LIKE 返回 (ORA 01722)

mysql - 如何将字符串从特定的列和行移动到不同的列和行?

ms-access - MS Access VBA - 在数据表子表单中显示动态构建的 SQL 结果

python - Pyodbc - 指定的 DSN 包含驱动程序和应用程序之间的体系结构不匹配