首页 > 解决方案 > MS Access VBA/SQL - 从 3 个表中选择不同的匹配记录并更新单个列

问题描述

我已经为此苦苦挣扎了几天,但我已经束手无策了。

我有 3 个需要比较的数据集 - 第一个带有 Part_ID 列表的表,然后是其他两个可能/可能不包含相同 ID 的数据集(“dataTables”)(对应的列存在于这两个表中,但值可能不是)。

我需要查看表 1 中的每个值(我们称之为 keyTable),查看它是否存在于任一数据表中,然后如果匹配,则从数据表中的列中获取值,称为“定义”并粘贴它位于与 Part_ID 位于同一行的 keyTable 中名为“def_exists”的列中。

我尝试了各种 SQL 查询,使用 DISTINCT 和嵌套的 SELECT 函数,但没有任何成功。我能够将 keyTable 中的 Part_ID 字段与 dataTables 之一匹配并正确附加“定义”值,但我无法删除重复项,因为 Part_ID 和定义之间存在一对多关系dataTable,我最终得到了超过一百万个重复项(keyTable 是 ~16k 记录,Query 返回 ~1.6m)。尝试一次查询所有三个表最终得到 1.25 亿多条记录。

我希望我正在尝试实现的一个示例将使这更容易理解,因为它可能听起来有点模糊或令人困惑。

键表

ID    Part_ID    Random_Info    Def_Exists_1    Def_Exists_2
1     ABC123     Bla            
2     BCD234     Bla
3     CDE345     Bla
4     DEF456     Bla            
5     EFG567     Bla
6     FGH678     Bla

数据表1

ID    Part_ID    Definition
1     ABC123     A1
2     ABC123     A2
3     ABC123     A3
4     ABC123     A4
5     BCD234     B1
7     BCD234     B2
8     BCD234     B3
9     CDE345     C1
10    CDE345     C2

数据表2

ID    Part_ID    Definition
1     DEF456     D1
2     DEF456     D2
3     DEF456     D3
4     EFG567     E1
5     EFG567     E2
6     EFG567     E3
7     FGH678     F1
8     FGH678     F2
9     FGH678     F3

所需的输出键表

ID    Part_ID    Random_Info    Def_Exists_1    Def_Exists_2
1     ABC123     Bla            A1
2     BCD234     Bla            B1
3     CDE345     Bla            C1
4     DEF456     Bla                            D1
5     EFG567     Bla                            E1
6     FGH678     Bla                            F1

我希望示例表使它更清楚一点。如果有多个匹配项,即 DEF456 的 D1、D2、D3,我只想显示第一条记录,或者甚至只是纯文本中的“是”。

我还需要在正确的列中显示“是”或定义,即 dataTable1 = Def_Exists_1,dataTable2 = Def_Exists_2。

任何帮助都会很棒,我觉得我已经在网上搜索了解决方案,但没有人知道 - 无论是那个还是我的 SQL 仍然生锈(这很可能)。

标签: sqlvbadatabasems-accessselect

解决方案


我认为你可以用子查询来做到这一点

select kt.*,
       (select top (1) as definition
        from datatable1 dt1
        where dt1.part_id = kt.part_id
       ) as definition_1,
       (select top (1) as definition
        from datatable1 dt2
        where dt2.part_id = kt.part_id
       ) as definition_2
from keytable as kt;

请注意,这将返回任意匹配的定义。order by您可以通过在子查询中包含一个来指定哪个定义(例如第一个定义),例如order by id.


推荐阅读