我有一个用于报告的Access MDB,它具有来自SQL Server2005的链接表视图。我构建了一个从PO表中检索信息的查询,并根据另一个表中的信息对行项目进行分类。我相对确定查询是正常的,直到大约一个月前,我们根据主要应用程序(创建数据)的要求,在服务器上从兼容模式80切换到90。我不能百分之百肯定地说,但这是过去90天内唯一的重大变化。我们注意到数据突然没有出现在查询中,这使得报告看起来很奇怪。
这是失败查询的副本:
SELECT dbo_porel.jobnum, dbo_joboper.opcode, dbo_porel.jobseqtype,
dbo_opmaster.shortchar01,
dbo_porel.ponum, dbo_porel.poline, dbo_podetail.unitcost
FROM ((dbo_porel
LEFT JOIN dbo_joboper ON (dbo_porel.assemblyseq = dbo_joboper.assemblyseq)
AND (dbo_porel.jobseq = dbo_joboper.oprseq)
AND (dbo_porel.jobnum = dbo_joboper.jobnum))
LEFT JOIN dbo_opmaster ON dbo_joboper.opcode = dbo_opmaster.opcode)
LEFT JOIN dbo_podetail ON (dbo_porel.poline = dbo_podetail.poline)
AND (dbo_porel.ponum = dbo_podetail.ponum)
WHERE (dbo_porel.jobnum="367000003")它返回以下内容:
jobnum opcode jobseqtype shortchar01 ponum poline unitcost
367000003 S 6624 2 15查询通常应该显示操作码和shortchar01的值。如果我删除链接表dbo_podetail,它会正确地显示这些字段的数据(尽管我显然不再有单位成本)。起初,我认为这可能是数据问题,但我发现,如果我嵌套查询,然后链接表,它会工作得很好。
例如,下面的代码可以完美地工作:
SELECT qryTest.*, dbo_podetail.unitcost
FROM (
SELECT dbo_porel.jobnum, dbo_joboper.opcode, dbo_porel.jobseqtype,
dbo_opmaster.shortchar01, dbo_porel.ponum, dbo_porel.poline
FROM (dbo_porel
LEFT JOIN dbo_joboper ON (dbo_porel.jobnum=dbo_joboper.jobnum)
AND (dbo_porel.jobseq=dbo_joboper.oprseq)
AND (dbo_porel.assemblyseq=dbo_joboper.assemblyseq))
LEFT JOIN dbo_opmaster ON dbo_joboper.opcode=dbo_opmaster.opcode
WHERE (dbo_porel.jobnum="367000003")
) As qryTest
LEFT JOIN dbo_podetail ON (qryTest.poline = dbo_podetail.poline)
AND (qryTest.ponum = dbo_podetail.ponum)我不明白为什么它在后一种情况下有效,而在第一种情况下不起作用。更糟糕的是,它似乎间歇性地适用于某些记录,而不适用于其他记录(它对哪些记录有效,哪些记录无效)是一致的。
你们这些专家有什么想法吗?
发布于 2009-03-06 03:42:30
在Access中,您肯定需要为多个左/右连接使用子查询。
我认为这是Jet优化器的一个限制,如果你只是链接左/右连接,它会被弄糊涂。
你可以经常see that this is a recurrent problem那个表面。
发布于 2009-03-05 18:30:40
我总是对Access在joins中使用括号感到困惑。试着去掉多余的括号。
FROM
dbo_porel
LEFT JOIN
dbo_joboper ON (dbo_porel.assemblyseq = dbo_joboper.assemblyseq)
AND (dbo_porel.jobseq = dbo_joboper.oprseq)
AND (dbo_porel.jobnum = dbo_joboper.jobnum)
LEFT JOIN
dbo_opmaster ON (dbo_joboper.opcode = dbo_opmaster.opcode)
LEFT JOIN
dbo_podetail ON (dbo_porel.poline = dbo_podetail.poline)
AND (dbo_porel.ponum = dbo_podetail.ponum)好的,上面的方法不起作用--抱歉,我放弃了
https://stackoverflow.com/questions/615609
复制相似问题