3

我有一个用于报告的 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)


我不知道为什么它在后一种情况下有效,而不是在第一种情况下有效。更糟糕的是,它似乎对某些记录间歇性地工作,而不是对其他记录(它对它起作用和不起作用的那些是一致的)。

你们中的任何专家有什么想法吗?

4

2 回答 2

1

您肯定需要在 Access 中为多个左/右连接使用子查询。
我认为这是 Jet 优化器的一个限制,如果您只是链接左/右连接,则会感到困惑。

您可以看到这是一个经常出现的问题

于 2009-03-06T03:42:29.920 回答
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)

好的,以上不起作用-对不起,我放弃了

于 2009-03-05T18:30:39.983 回答