Access查询返回空字段,具体取决于表的链接方式

时间:2009-03-05 16:45:39

标签: sql sql-server-2005 ms-access ms-access-2007

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


我不知道为什么它适用于后一种情况而不是第一种情况。更糟糕的是,它似乎间歇性地用于某些记录而不是其他记录(它与它所做的一致并且不起作用)。

你们这些专家有什么想法吗?

2 个答案:

答案 0 :(得分:1)

您肯定需要在Access中使用子查询进行多个左/右连接 我认为如果你只是链接左/右连接,那么Jet优化器的局限就会变得混乱。

你可以经常see that this is a recurrent problem

答案 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)

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