Access 2007:使用联接

时间:2015-08-05 14:48:41

标签: sql ms-access ms-access-2007

我正在尝试设计一个查询,该查询将返回表A中的一组行,这些行的fileID值与表B的子集中至少有一行匹配,其中表格B已过滤,B.row1 CONTAINS varInput。 (B只有两列,fileIDrow1。)

到目前为止,我已经做了两次尝试:首先使用

形式的子查询
WHERE 
(
    A.fileID IN 
    (
      SELECT fileID FROM B
      WHERE B.row1 LIKE "*" & varInput & "*"
    ) 
    OR (varInput Is Null)
)

虽然上面的方法返回了我正在寻找的值,但是速度慢得令人无法接受;将它添加到我的WHERE子句会导致整个搜索时间超过45秒。 (没有子查询,搜索只需不到3秒。)

为了提高速度,我按照建议的here用JOIN操作替换了子查询。但是,加入(我使用LEFT OUTER JOIN B ON A.fileID = B.fileID)实际上并没有过滤掉任何结果,而且我不知道如果有的话,我可以做些什么来改变它。 (使用内部联接代替没有区别,因为B中的每一行都包含fileID中的A,因为B来自A }。)

我尝试通过加入varInput = B.fileID来改进结果,但似乎我不能在JOIN语句中使用输入值(varInput在这里是未绑定表单上的文本框控件的内容)。

对于上下文,生成B是为了规范化A,其中包含12个相同类别数据的字段。 (在这种情况下,街道名称。)原始查询显示A的大多数列,但只有一列来自已浓缩为B的组。上面的子查询给出了与原始查询的以下摘录相同的结果:

AND (
  (A.row LIKE "*" & varInput & "*")
  OR (A.row1 LIKE "*" & varInput & "*")
  ...
  OR (A.row12 LIKE "*" & varInput & "*")
)

那么,我想,我的问题归结为"如何以更快的方式复制上述子查询的结果?"

或者,我认为减速可能是由于对表A中的每条记录执行的子查询造成的;如果是这种情况,可以做什么(如果有的话)以确保它只运行一次,存储结果以便可以将它们与A中的每个记录进行比较?

我遵循了下面的Gordon Linoff的建议,并发现虽然他的方法(在连接中放置查询)对于varInput时的单个连接来说既实用又快如果给出,当多个连接处于播放状态时,它不能正常工作,返回 连接为真的行,而不是两者。我怀疑我可以通过嵌套连接而不是依次运行它来解决这个问题,但我不确定具体细节。

澄清"多个连接"方面,考虑第三个表C。除了在fileID中搜索包含varInput的{​​{1}}行之外,我还需要B中匹配C的行。 (input2包含名为CfileID的列。)我需要为每个rowC E返回一条记录,以便fileID中有一行(B = E和fileID = row1varInput中有一行(C = E AND fileID = {{ 1}})。

有关示例,请参阅this paste。 (外部链接用于等宽文本。)

1 个答案:

答案 0 :(得分:1)

你试过这个版本吗?

  

我正在尝试设计一个将从中返回一组行的查询   表A具有与a中至少一行匹配的fileID值   表B的子集,其中表B被过滤,使得B.row1 CONTAINS   varInput。 (B只有两列,fileID和varInput。)

     到目前为止,我已经做了两次尝试:首先是一个子查询   形式

SELECT A.*
FROM A INNER JOIN
     (SELECT fileID
      FROM B
      WHERE B.row1 LIKE "*" & varInput & "*"
     ) as B
     ON B.fileID = A.fileId
UNION ALL
SELECT A.*
FROM A
WHERE varInput Is Null;

如果输入变量为LEFT JOIN,则会删除UNION ALL,使用NULL表示所有数据。

此外,如果文件ID可以重复,则子查询可能需要SELECT DISTINCT