Access中长期运行的SQL查询

Access中长期运行的SQL查询,sql,ms-access,Sql,Ms Access,我正试图编写一个查询,由于某种原因导致Access 2007-2010挂起,我认为这是因为该查询需要花费很长时间。我从来没有等待足够长的时间来看看它是否会返回结果 我有一个包含100k+家庭地址的表“MAIN”,还有一个包含100个地址的表“ALIAS”。“MAIN”表是我要返回的记录。“别名”表中有一小部分来自MAIN的地址以及MAIN中不存在的其他地址。别名表用于对相关的地址集进行分组。将其视为当前/主地址和旧/别名地址。它们在别名表中共享一个ID,因此我知道哪些是相关的 因此,查询地址并返

我正试图编写一个查询,由于某种原因导致Access 2007-2010挂起,我认为这是因为该查询需要花费很长时间。我从来没有等待足够长的时间来看看它是否会返回结果

我有一个包含100k+家庭地址的表“MAIN”,还有一个包含100个地址的表“ALIAS”。“MAIN”表是我要返回的记录。“别名”表中有一小部分来自MAIN的地址以及MAIN中不存在的其他地址。别名表用于对相关的地址集进行分组。将其视为当前/主地址和旧/别名地址。它们在别名表中共享一个ID,因此我知道哪些是相关的

因此,查询地址并返回主表中的地址或主表中在别名表中具有记录关系的任何内容。下面是一个例子:

主要
编号、方向、名称、类型
西1街123号
西一街456号

别名
编号、方向、名称、类型、组ID
456 W第一街99号
789东二街99号
因此,如果用户查询789 E 2nd ST,它应该从MAIN返回456 W 1st ST,因为789地址存在于别名表中,并且与456相关,而456也在MAIN中

这是我的查询,它运行时间太长,可能需要几天才能返回

SELECT dbo_ae_dt9.docid, dbo_ae_dt9.ID, dbo_ae_dt9.Permit, dbo_ae_dt9.stDirection, 
dbo_ae_dt9.stNumber, dbo_ae_dt9.stType, dbo_ae_dt9.inspDate, dbo_ae_dt9.stName, 
dbo_ae_dt9.numobjects
FROM dbo_ae_dt9 LEFT JOIN dbo_ae_alias ON 
(dbo_ae_dt9.stNumber=dbo_ae_alias.stNumber) AND 
(dbo_ae_dt9.stDirection=dbo_ae_alias.stDirection) AND 
(dbo_ae_dt9.stName=dbo_ae_alias.stName) AND 
(dbo_ae_dt9.stType=dbo_ae_alias.stType)
WHERE (dbo_ae_alias.aliasID in  
   (SELECT aliasID   
    FROM dbo_ae_alias  
    WHERE ((IIf(IsNull(Forms!frmMain!txtstName),dbo_ae_alias.stName like "*", dbo_ae_alias.stName=Forms!frmMain!txtstName)) AND
    (IIf(IsNull(Forms!frmMain!txtstNumber),dbo_ae_alias.stNumber like "*", dbo_ae_alias.stNumber=Forms!frmMain!txtstNumber)) AND
    (IIf(IsNull(Forms!frmMain!txtstDirection),dbo_ae_alias.stDirection like "*", dbo_ae_alias.stDirection=Forms!frmMain!txtstDirection)) AND
    (IIf(IsNull(Forms!frmMain!txtstType),dbo_ae_alias.stType like "*", dbo_ae_alias.stType=Forms!frmMain!txtstType))))) OR
    ((IIf(IsNull([Forms]![frmMain]![txtPermit]),dbo_ae_dt9.Permit Like "*",dbo_ae_dt9.Permit = Forms!frmMain!txtPermit)) And
    (IIf(IsNull(Forms!frmMain!txtstNumber),dbo_ae_dt9.stNumber Like "*",dbo_ae_dt9.stNumber = Forms!frmMain!txtstNumber)) And
    (IIf(IsNull(Forms!frmMain!txtstDirection),dbo_ae_dt9.stDirection Like "*",dbo_ae_dt9.stDirection = Forms!frmMain!txtstDirection)) And 
    (IIf(IsNull(Forms!frmMain!txtstName),dbo_ae_dt9.stName Like "*",dbo_ae_dt9.stName = Forms!frmMain!txtstName)) And 
    (IIf(IsNull(Forms!frmMain!txtstType),dbo_ae_dt9.stType Like "*",dbo_ae_dt9.stType = Forms!frmMain!txtstType)) And 
    (IIf(IsNull(Forms!frmMain!txtstInspDate),dbo_ae_dt9.inspDate Like "*",dbo_ae_dt9.inspDate = Forms!frmMain!txtstInspDate)))

类似的声明显然是你的罪魁祸首…为什么要检查这么多以确保有“*”?(like在访问方面进行了可怕的优化,几乎没有单一like的功能。你有10个like)如果用户没有在字段中输入任何内容,我希望它在该字段中充当通配符。因此,我检查表单是否为null,如果是,则使用像“*”这样的命令来获取该列的任何结果。否则说txtstName=alias.stname在他们不输入某些内容时就不起作用。如果您需要所有这些
IIf(IsNull(…类似于
子句)。您可能编写了效率最低的
WHERE
子句(在子选择中,不少于),然后抱怨性能不好。你需要退后一步,重新思考你的整个设计;我认为这里甚至没有任何可以挽救的东西。