我有这个ms访问查询:
SELECT t1.sb, suchbegriff2, menge
FROM (SELECT artnr & '/' & [lfdnr-kal] AS sb, left(suchbegriff,7) &
val(right(suchbegriff,4)) AS suchbegriff2
FROM kvks
WHERE suchbegriff like '*/*') AS t1
INNER JOIN (SELECT artnr & '/' & [lfdnr-kal] AS sb,
[artnr-hz] & '/' & val(lfdnr) AS hz, menge
FROM konf
WHERE [artnr-hz]<>'') AS t2
ON (t1.sb=t2.sb) AND (t1.suchbegriff2=t2.hz);
它运行得非常慢(超过30秒)。我想通了,这是因为inner join
部分。如果我离开这个,速度是正确的。
也许是因为事实缓慢,连接字段是计算表达式?
修改
我根据Smandoli的答案修改了查询:
SELECT kvks.artnr & '/' & kvks.[lfdnr-kal] AS sb,
left(suchbegriff,7) & val(right(suchbegriff,4)) AS suchbegriff2,
konf.menge
FROM kvks, konf
WHERE kvks.suchbegriff like '*/*'
and konf.[artnr-hz]<>''
and kvks.artnr=konf.artnr
and kvks.[lfdnr-kal]=konf.[lfdnr-kal]
and left(suchbegriff,7) & val(right(suchbegriff,4))=[artnr-hz] & '/' & val(lfdnr)
现在运行正确。
感谢您的贡献。
答案 0 :(得分:3)
这些计算字段确实很复杂。为何不直接加入?下面的查询会留下一个'/'
未列入的内容,但应该告诉您我在想什么。
SELECT
t1.sb,
left(st1.uchbegriff,7) & val(right(t1.suchbegriff,4)) AS suchbegriff2,
t1.menge
FROM kvks AS t1
INNER JOIN konf AS t2
WHERE (t1.suchbegriff like '*/*')
AND (t2.artnr-hz<>'')
AND (t1.artnr=t2.artnr)
AND (t1.lfdnr-kal=t2.lfdnr-kal)
AND (left(t1.suchbegriff,7)=t1.[artnr-hz])
AND (val(right(t1.suchbegriff,4))=val(t2.hz));
答案 1 :(得分:1)
对于内部联接,您可以尝试使用已保存的查询(或临时表),而不是在运行时编写查询。
所以,我首先尝试抽象这个查询
SELECT artnr & '/' & [lfdnr-kal] AS sb,
[artnr-hz] & '/' & val(lfdnr) AS hz, menge
FROM konf
WHERE [artnr-
hz]<>'') AS t2
ON (t1.sb=t2.sb) AND (t1.suchbegriff2=t2.hz)
其次,如果可能的话,我会抽象查询中的一些函数。您可以使用VBA执行此操作,或者在查询之外操作数据。
第三,您总是可以在桌面上创建一个字段,将您需要的两个字段组合在一起。
E.x:在konf
表格中新建一个存储artnr & '/' & [lfdnr-kal]
您需要做的是限制运行时字段的功能/计算/合并。查询要做的事情很多,如果它运行缓慢,我会看到它之间的方向相关性,或者与索引/连接不一致的东西。
如果您已将此识别为连接问题,则可以使用VBA根据查询启动临时表,并将其用作记录源而不是SQL。 此外,如果您不使用临时表,至少保存查询。这允许Access有一个运行查询的计划,而您的查询是100%依赖于运行时。
答案 2 :(得分:0)
由于&#34;嵌套&#34;您的查询运行缓慢然后&#34;加入&#34;。您可以尝试创建临时表并在查询中使用该表。创建临时表是一种很好的做法,而不是使查询变得复杂。
答案 3 :(得分:-1)
99999 !!!我想你只需要实现一些索引
(t1.sb=t2.sb) AND (t1.suchbegriff2=t2.hz);
这些非常可疑。是4索引?