我有一个用于报告的Access MDB,它链接了SQL Server 2005中的表视图。我构建了一个查询,从PO表中检索信息,并根据另一个表中的信息对行项进行分类。我相对肯定查询是好的,直到大约一个月前,当我们从主要应用程序(创建数据)的要求从服务器上的兼容模式80转移到90时。我无法100%确定地说出这一点,但这是过去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
查询通常应该显示opcode和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)
我不知道为什么它适用于后一种情况而不是第一种情况。更糟糕的是,它似乎间歇性地用于某些记录而不是其他记录(它与它所做的一致并且不起作用)。
你们这些专家有什么想法吗?
答案 0 :(得分:1)
您肯定需要在Access中使用子查询进行多个左/右连接 我认为如果你只是链接左/右连接,那么Jet优化器的局限就会变得混乱。
答案 1 :(得分:0)
我总是对Access在连接中使用括号感到困惑。尝试剥离额外的括号。
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)
好的以上不起作用 - 抱歉,我放弃了