由 INNER JOIN-ing 3 个表产生的记录集不可更新

Posted

技术标签:

【中文标题】由 INNER JOIN-ing 3 个表产生的记录集不可更新【英文标题】:Recordset resulting from INNER JOIN-ing 3 tables not updateable 【发布时间】:2015-04-13 11:49:56 【问题描述】:

我在 Access 2007 中有 3 个表,其中一个是涡轮泵列表,并且有一个主键 [Numéro interne]。我正在尝试进行一个查询,将该表与其他两个表中列出的泵相关的每种类型的最新操作连接起来。

连接 2 个表产生的记录集仍然是可更新的:

SELECT t.*, n.[Numéro attribué]
  FROM Turbopompes AS t 
  INNER JOIN (
    SELECT Turbopompe, [Date attribution], [Numéro attribué]
    FROM [Turbopompes Numéros]
    ORDER BY [Date attribution] DESC
  ) AS n ON t.[Numéro interne] = n.Turbopompe;

但无论我如何表达,加入 3 个表都会使结果变为只读:

SELECT t.*, n.[Numéro attribué], m.[Date maintenance], m.Détails
FROM (
  Turbopompes AS t 
  INNER JOIN (
    SELECT Turbopompe, [Date attribution], [Numéro attribué]
    FROM [Turbopompes Numéros]
    ORDER BY [Date attribution] DESC
  ) AS n ON t.[Numéro interne] = n.Turbopompe
) INNER JOIN ( 
  SELECT Turbopompe, [Date maintenance], Détails
  FROM [Turbopompes Maintenances]
  ORDER BY [Date maintenance] DESC
) AS m ON t.[Numéro interne] = m.Turbopompe;

我尝试过的另一个查询结果相同:

SELECT t.*, n.[Numéro attribué], m.[Date maintenance], m.Détails
FROM (
  Turbopompes AS t 
  INNER JOIN (
    SELECT Turbopompe, [Date attribution], [Numéro attribué]
    FROM [Turbopompes Numéros]
    ORDER BY [Date attribution] DESC
  ) AS n ON t.[Numéro interne] = n.Turbopompe
) INNER JOIN ( 
  Turbopompes AS t2
  INNER JOIN (
    SELECT Turbopompe, [Date maintenance], Détails
    FROM [Turbopompes Maintenances]
    ORDER BY [Date maintenance] DESC
  ) AS m ON t2.[Numéro interne] = m.Turbopompe
) ON t.[Numéro interne] = t2.[Numéro interne];

发件人:

http://www.fmsinc.com/Microsoftaccess/query/non-updateable/index.html

您的数据可能无法更新的原因有很多。 :

具有不在关键字段上的多表连接的查询

所以 Turbopompes 和 [Turbopompes Numéros] 之间的内部连接不保留主键?有什么办法解决吗?

【问题讨论】:

【参考方案1】:

Access 在连接表达式的嵌套方面有些特殊。 字段“Turbopompe”必须是表 N 和表 M 中的主键。如果这样,您应该使用此查询获得所需的、可更新的结果:

SELECT t.*, n.[Numéro attribué], m.[Date maintenance], m.[Détails]
FROM ( Turbopompes AS t 
INNER JOIN [Turbopompes Numéros] AS n 
  ON t.[Numéro interne] = n.Turbopompe )
INNER JOIN [Turbopompes Maintenances]   AS m 
  ON t.[Numéro interne] = m.Turbopompe
ORDER BY n.[Date attribution] DESC, 
     m.[Date maintenance];

但是,如果表 N 和 M 包含每个 [Numéro interne] 的多条记录,您将需要首先获取每个“Turbopompe”的最新记录的查询,然后将它们作为派生表连接以查找您要查找的记录.这可能如下所示:

SELECT t.*, n.[Numéro attribué], m.[Date maintenance], m.Détails
FROM (
  Turbopompes AS t 
INNER JOIN (
  SELECT n1.Turbopompe, n1.[Date attribution], n1.[Numéro attribué]
  FROM [Turbopompes Numéros] n1
  INNER JOIN (SELECT Turbopompe, MAX([Date attribution]) AS MaxDateAttribution
            FROM [Turbopompes Numéros] 
            GROUP BY Turbopompe) n_max
    ON n1.[Date attribution] = n_max.MaxDateAttribution
    AND n1.Turbopompe = n_max.Turbopompe
  ) AS n ON t.[Numéro interne] = n.Turbopompe
) INNER JOIN ( 
  SELECT m1.Turbopompe, m1.[Date maintenance], m1.[Détails]
  FROM [Turbopompes Maintenances] m1
  INNER JOIN (SELECT Turbopompe, MAX([Date maintenance]) AS MaxDateMaintenance
                FROM [Turbopompes Maintenances]
                GROUP BY Turbopompe ) m_max
    ON m1.Turbopompe = m_max.Turbopompe
    AND m1.[Date maintenance] = m_max.MaxDateMaintenance
) AS m ON t.[Numéro interne] = m.Turbopompe;

但是,由于必须按 [日期维护]/[日期归属] 汇总记录以查找每个表中的最新记录,不可能编写任何返回正确结果的查询一个可更新的记录集

【讨论】:

糟糕,我完全忘记了这个问题,感谢 PhilS 解决这个问题。我将尝试使用临时表制作 VBA 解决方法,但对于应该很简单的事情来说,这需要做很多工作。

以上是关于由 INNER JOIN-ing 3 个表产生的记录集不可更新的主要内容,如果未能解决你的问题,请参考以下文章

MySQL INNER JOIN 3 个表的计数和总数

来自第二个表的 MySQL INNER JOIN (TOP10)

使用 INNER JOIN 时得到重复的结果

MySql INNER JOIN三表联查性能如何提升

26.MySQL中的内连接INNER JOIN

MS Access Inner Join 3 个具有相同 field_name 的表