【问题标题】:MS Access VBA/SQL - Select Distinct matching records from 3 tables and update a single columnMS Access VBA/SQL - 从 3 个表中选择不同的匹配记录并更新单个列
【发布时间】:2019-04-26 01:25:05
【问题描述】:

我已经为此苦苦挣扎了几天了,我已经无计可施了。

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

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

我尝试了各种 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 仍然生锈(这很可能)。

【问题讨论】:

    标签: sql vba database ms-access select


    【解决方案1】:

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

    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)来指定哪个定义(例如第一个定义)。

    【讨论】:

    • 我试过下面的代码,分别用 Siemens_BOM_Summary、IMS1_CODAC 和 IMSA_CODAC 作为 keyTable、dataTable1 和 dataTable2;和 Component_Number/Part_No 分别作为 BOM_Summary 和 IMS 表的 part_ID。 SELECT BOM.*, (SELECT TOP (1) AS Definition FROM IMS1_CODAC ims1 WHERE ims1.Part_No = BOM.Component_Number As Exists_IMS1, (SELECT TOP (1) AS Definition FROM IMSA_CODAC imsa WHERE imsa.Part_No = BOM.Component_Number As Exists_IMSA FROM Siemens_BOM_Summary AS BOM; Where Exists_IMSx = definition_x 它抛出错误:'Syntax error' for the first SELECT TOP 1
    猜你喜欢
    • 2015-09-29
    • 1970-01-01
    • 1970-01-01
    • 2019-05-02
    • 1970-01-01
    • 1970-01-01
    • 2013-03-15
    • 2012-03-10
    • 2021-04-12
    相关资源
    最近更新 更多