【问题标题】:Access query returns empty fields depending on how table is linkedAccess 查询根据表的链接方式返回空字段
【发布时间】:2009-03-05 16:45:38
【问题描述】:

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


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

各位专家有什么想法吗?

【问题讨论】:

  • SELECT 语句中的列之一是查询主表上的 PK 吗?其次,如果您的表中有时间戳字段并将其包含在所有 SQL 语句中,Access 可以更好地显示和刷新绑定表单中的数据。

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


【解决方案1】:

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

您可以see that this is a recurrent problem 经常出现。

【讨论】:

  • 如果 Jet 查询优化器出错了,那么只需使用直通,不是吗?
  • 我已经进行了大量搜索,但找不到这个问题的答案。这似乎是我得到的唯一答案,除非我想在 VBA 中处理直通查询。
【解决方案2】:

我总是对 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)

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

【讨论】:

  • 访问更注重安全性而不是可读性。操作顺序可以简化为:括号,然后是其他所有内容。
  • 我尝试删除多余的括号(根据您的代码 sn-p),但它拒绝运行 throwing out: "Syntax Error" Invalid operator
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-01
  • 2023-04-07
  • 1970-01-01
  • 1970-01-01
  • 2011-06-13
相关资源
最近更新 更多