如何连接访问中涉及链接的多行?

06odsfpq  于 2021-08-01  发布在  Java
关注(0)|答案(2)|浏览(401)

我的access数据库有以下问题:
我有三个表,分别是tblcomponents、tblerrors和linkcomponentserrors。这是一个多对多关系,这意味着一个组件可以有许多错误,而一个错误可以有许多组件。它们与linkcomponentserrors中的主键(tblcomponents.componentid和tblerErrors.errorid)链接。两个表的名称都有一个字段
TBL组件/TBL错误/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语法中,这个连接到了错误的名称。如果你知道这个问题的解决办法,我将非常高兴。

6ss1mwsb

6ss1mwsb1#

您可以使用我的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;

输出:

yzckvree

yzckvree2#

如果不想使用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中选择tblcomponents.compname,concatrelated(“errname”,“hilfsabfrage”,“compid=”&[hilfsabfrage].[compid])。查询必须没有[hilfsabfrage]。
您还可以在查询中放置多个concatrelated。

相关问题