【问题标题】:How to concatenate multiple rows in Access involving a Link?如何在涉及链接的 Access 中连接多行?
【发布时间】:2022-01-18 15:44:51
【问题描述】:

我的 Access 数据库存在以下问题:

我有 3 个表,它们是 tblComponents、tblErrors 和 linkComponentsErrors。这是多对多的关系,这意味着一个组件可能有很多错误,而一个错误可能有很多组件。这些 a 与它们在 linkComponentsErrors 中的 primaryKey(tblComponents.componentID 和 tblErrors.errorID)链接。这两个表也都有一个字段用于他们的名字

tblComponents / tblErrors / linkComponentsErrors

|compID|compname|        |errID|errname|        |compID|errID| 
+------------+           +------------+         +------------+
| 1 | HDD-300 |          | 1 | E101 |           | 1 | 1 |
+------------+           +------------+         +------------+
| 2 | SSD-100 |          | 2 | E404 |           | 1 | 2 |
+------------+           +------------+         +------------+
| 3 | CPU-i7 |           | 3 | E123 |           | 2 | 2 |
                                                +------------+
                                                | 2 | 3 |
                                                +------------+
                                                | 3 | 3 |

对于连接,我使用Allen Browne的VBA代码

当我使用串联进行此查询时

SELECT tblComponents.compName, ConcatRelated("errorID", "linkComponentsErrors", "compID = " &[linkComponentsErrors].[compID]) FROM tblComponents;

我明白了:

    |compName|Expr| 
    +------------+
    | HDD-300 | 1, 2 |
    +------------+
    | SSD-100 | 2, 3 |
    +------------+
    | CPU-i7 | 3 |
    +------------+

但我想要的是这样的:

    |compName|Expr| 
    +------------+
    | HDD-300 | E101, E404 |
    +------------+
    | SSD-100 | E404, E123 |
    +------------+
    | CPU-i7 | E123 |
    +------------+

我在 Concat 函数中的 SQL 语法中迷失了这个连接到错误的名称。如果您知道解决此问题的方法,我将非常高兴。

【问题讨论】:

  • 看来您只需将ErrorID (errID?) 更改为ErrName
  • 但是我在哪里说 errName 属于 tblErrors?该方法不知道 errName 来自哪里。

标签: sql vba ms-access concat


【解决方案1】:

您可以为此使用我的DJoin 函数:

SELECT 
    tblComponents.compname, 
    DJoin(
        "errname",
        "SELECT compID, errname 
            FROM linkComponentsErrors 
            INNER JOIN tblErrors ON linkComponentsErrors.errID = tblErrors.errID",
        "compID = " & [tblComponents].[compID] & "",
        ", ") AS errnames
FROM 
    tblComponents 
INNER JOIN 
    linkComponentsErrors ON tblComponents.compID = linkComponentsErrors.compID
GROUP BY 
    tblComponents.compname, 
    DJoin(
        "errname",
        "SELECT compID, errname 
            FROM linkComponentsErrors 
            INNER JOIN tblErrors ON linkComponentsErrors.errID = tblErrors.errID",
        "compID = " & [tblComponents].[compID] & "",
        ", "), 
    tblComponents.compID
ORDER BY 
    tblComponents.compID;

输出:

【讨论】:

  • 哇,非常感谢,这真的很有帮助。但是当我有像 tblCategories 这样的第四个表,它与像 tblErrors 这样的 tblComponents 有相同的关系时,我该怎么办?我是否只需要重复此操作,使用 tblCategories 在 Group by 中添加另一个 DJoin()、一个 InnerJoin 和 DJoin() 进行选择?
  • 这可能有点困难,因为DJoin 只包含一个集合,因此它也应该包含类别。我猜可以通过使用复合键来完成。或者您可以进行两次查询并将结果输出到两个临时表,然后将它们组合起来以获得最终结果。您可能需要参考此打开一个新问题,列出其他输入(类别)和预期结果。
【解决方案2】:

如果你不想使用 DJoin,你可以做两个查询并使用 Allen Browne 的 ConcatRelated 函数:

与链接进行连接的帮助查询“Hilfsabfrage”:

SELECT tblErrors.errName, tblErrors.errID, linkComponentsErrors.CompID FROM tblErrors INNER JOIN linkComponentsErrors ON tblErrors.errID = linkComponentsErrors.errID

主要查询:

SELECT tblComponents.compName, ConcatRelated("errName", "Hilfsabfrage", "compID = " & [compID]) FROM tblComponents

不要在你的主查询中这样做: 选择 tblComponents.compName, ConcatRelated("errName", "Hilfsabfrage", "compID = " &[Hilfsabfrage].[compID]) 从 tblComponents查询确实没有 [Hilfsabfrage]。

您还可以在查询中放置多个 ConcatRelated。

【讨论】:

    猜你喜欢
    • 2011-04-06
    • 1970-01-01
    • 2017-07-07
    • 2011-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多