我正在尝试设计一个查询,该查询将返回表A
中的一组行,这些行的fileID
值与表B
的子集中至少有一行匹配,其中表格B
已过滤,B.row1 CONTAINS varInput
。 (B
只有两列,fileID
和row1
。)
到目前为止,我已经做了两次尝试:首先使用
形式的子查询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
包含名为C
和fileID
的列。)我需要为每个rowC
E返回一条记录,以便fileID
中有一行(B
= E和fileID
= row1
)varInput
中有一行(C
= E AND fileID
= {{ 1}})。
有关示例,请参阅this paste。 (外部链接用于等宽文本。)
答案 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
。