具有200多个Where标准的SQL查询过于复杂(Access 2013)

时间:2015-07-14 13:58:22

标签: sql ms-access

所以我之前从未使用过SQL,我所知道的几乎所有内容都是来自Access的Query Designer,然后查看生成的SQL代码。所以我很确定我没有这么做。

这是瘦的:

- 我有一个名为“SPC Data”的数据库,它测量了我们构建的每个电路板上每个组件的数据。

- 我想编写一个SQL查询,根据条形码和组件数据的组合获取大约500行。

- 查询是在其他地方的VBA宏中动态构建的,这就是现在的样子:

SELECT *
FROM [SPC Data]
WHERE ((([SPC Data].Barcode)=1504803581) AND (([SPC Data].[Component ID]) Like '*R56')) OR 
((([SPC Data].Barcode)=1433700392) AND (([SPC Data].[Component ID]) Like '*C15')) OR 
((([SPC Data].Barcode)=1433700664) AND (([SPC Data].[Component ID]) Like '*R56')) OR 
((([SPC Data].Barcode)=1433700486) AND (([SPC Data].[Component ID]) Like '*R56')) OR
... about 220 more lines of criteria

我觉得这不应该是内存密集型的,但Access抱怨查询过于复杂,除非我将查询减少到只有大约60个Or'd标准(可能更多,这可能只是一个随机有效的价值)。

我的问题是:我的SQL为什么不执行?我是否以一种使Access低效且过于复杂的方式编写SQL?有没有更好的方法来选择一堆匹配的标准?或者我应该将它分成多个SQL查询,每个查询约60个标准?我会很感激任何方向。

更新(1小时后):我仍然没有强大的解决方案;工会没有帮助,所以我猜这是一个Access问题。我可以尝试制作一个我需要的记录的临时表,然后将其与原始文件一起加入以获取DRapp建议的所有列数据,或者我可以拆分SQL并一次导入60个。我希望我有一些明显的错误。

3 个答案:

答案 0 :(得分:2)

我不认为使用“IN”子句的建议对您有用,因为您的条形码可以适用于多个组件ID?不确定,但可能吗?

您在获得解决方案方面可能更擅长的是创建一个辅助表并插入您要查找的所有内容,然后加入到该表中。不完全是,但原则如下:

create table tmpJoin( tryBarCode  integer, tryComponent varchar(5))

insert into tmpJoin ( tryBarCode, tryComponent ) values ( 1504803581, '*R56' )
insert into tmpJoin ( tryBarCode, tryComponent ) values ( 1433700392, '*C15')
insert into tmpJoin ( tryBarCode, tryComponent ) values ( 1433700664, '*R56')
insert into tmpJoin ( tryBarCode, tryComponent ) values ( 1433700486, '*R56')
etc for as many things as you are looking for...

现在,查询......

SELECT 
      sd.*
   FROM 
      [SPC Data] sd
         JOIN tmpJoin 
            on sd.barcode = tmpJoin.tryBarCode
            AND sd.[Component ID] like tmpJoin.tryComponent 

因此,如果tmpJoin中有1个或1000个条目,则查询不再存在。它只是找到一个匹配或不匹配,并返回SPC数据表中的行

当然,您需要在tmpJoin表上有一个索引用于查询优化,并在每次搜索时删除/重新创建或创建新的随机表名称并在完成后删除,这样如果多个人运行查询,则不会导致冲突...其他选项,例如添加列以标识唯一的新人的查询,并在完成运行查询后删除这些记录。

答案 1 :(得分:0)

不确定它会对#太复杂的问题有所帮助"但你不是所有那些()

看起来有些像重复一样 这可能有助于提高复杂性,而且可能会更快 喜欢Like' *非常慢 - 您希望最小化这些评估 Like' *上的索引并不好,因为它是一个表扫描

( [SPC Data].[Component ID] Like '*R56' 
  and [SPC Data].[Barcode] in (1504803581,1433700664,1433700486)  )  or 
( [SPC Data].[Component ID] Like '*C15' 
  and [SPC Data].[Barcode] in (1433700392)  )...

答案 2 :(得分:0)

首先,您可以尝试使用UNION或UNION ALL 其次,只选择您需要的字段 第三,我会使用MS-Acces以外的其他数据库。

SELECT * FROM [SPC Data]
WHERE [SPC Data].[Barcode]=1504803581 AND [SPC Data].[Component ID] Like '*R56'
UNION 
[SPC Data].[Barcode]=1433700664 AND [SPC Data].[Component ID] Like '*C15'
...
...

它看起来会更清晰,更容易调试。