我有一个用于报告的 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,它会正确显示这些字段的数据(尽管我显然不再有 unitcost)。起初我认为这可能是数据问题,但我发现如果我嵌套查询然后链接表,它工作正常。
例如,以下代码完美运行:
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)
我不知道为什么它在后一种情况下有效,而不是在第一种情况下有效。更糟糕的是,它似乎对某些记录间歇性地工作,而不是对其他记录(它对它起作用和不起作用的那些是一致的)。
你们中的任何专家有什么想法吗?