Sql 如何合并表中的记录并同时更新表?

Sql 如何合并表中的记录并同时更新表?,sql,ms-access,merge,ms-access-2013,Sql,Ms Access,Merge,Ms Access 2013,我有一个表(名为Data\u detailed),如下所示: sample_year| Cell_ID | Species_ID | a | b | c | d... 2017 | 103.60 | PLALAG | Adult | | Adult | 2017 | 103.60 | PLALAG | | Adult | Adult | 2017 | 1

我有一个表(名为
Data\u detailed
),如下所示:

sample_year| Cell_ID | Species_ID | a     | b        | c     | d... 
2017       | 103.60  | PLALAG     | Adult |          | Adult |    
2017       | 103.60  | PLALAG     |       | Adult    | Adult |      
2017       | 103.60  | TRIMON     | Adult | Adult    | Adult | Seedling
2017       | 103.70  | ANTNST     |       | Adult    | Adult |  
2017       | 103.70  | AVESTE     |       | Adult    | Adult |  
2017       | 103.70  | AVESTE     | Adult | Seedling |       | Seedling
2017       | 103.70  | BROSCO     | Adult | Adult    |       |      
它有三个识别字段(
sample\u year
Cell\u ID
Species\u ID
),然后是一些列,这些列可以是空的,也可以包含两个值之一:“幼苗”和“成体”

如您所见,我的标识字段的某些组合重复了不止一次(例如单元格103.7中的“AVESTE”),我希望使用两个简单规则将它们组合到一个记录中:

  • 对于每个字段(
    a
    b
    等),如果有值,则取它
  • 如果您同时拥有“幼苗”和“成人”-请选择“幼苗”
  • 因此,我创建了一个查询,以查找与我的标识字段(名为
    Data\u detailed\u duplicates
    )相关的所有重复记录:

    到目前为止,一切进展顺利

    但是,我不希望提取查询结果中的所有合并记录,而是希望它们在表中实际更新,这样每合并两个或多个记录将只产生一个记录,包含所有信息,并且所有其他记录都将从表中删除。我该怎么做

    上述示例的结果是:

    sample_year| Cell_ID | Species_ID | a     | b        | c     | d... 
    2017       | 103.60  | PLALAG     | Adult | Adult    | Adult |    
    2017       | 103.60  | TRIMON     | Adult | Adult    | Adult | Seedling
    2017       | 103.70  | ANTNST     |       | Adult    | Adult |  
    2017       | 103.70  | AVESTE     | Adult | Seedling | Adult | Seedling
    2017       | 103.70  | BROSCO     | Adult | Adult    |       |      
    

    TL;DR:我在表上使用一个新字段来标记所有重复项,在合并到表中后将其追加,并删除标记的记录


    以下是我最终解决问题的方法:

    我使用第一个查询(
    Data\u detailed\u duplicates
    )创建要合并的所有记录的列表,使用第二个查询(
    Data\u detailed\u merged\u duplicates
    )创建应替换表中重复项的记录列表。所有这些都是问题中提到的

    接下来,在我的表中创建一个新字段(
    Duplicates
    ),并使用以下更新查询标记所有重复记录:

    UPDATE DISTINCTROW Data_detailed_duplicates
    INNER JOIN Data_detailed ON (Data_detailed_duplicates.sample_year = Data_detailed.sample_year)
        AND (Data_detailed_duplicates.Cell_ID = Data_detailed.Cell_ID)
        AND (Data_detailed_duplicates.Species_ID = Data_detailed.Species_ID)
    SET Data_detailed.Duplicates = 1
    WHERE (((Data_detailed.Duplicates)=False));
    
    现在,我使用另一个查询将所有合并的记录追加到表中:

    INSERT INTO Data_detailed ( sample_year, Cell_ID, Species_ID, a, b, c, d, e, f, g, h, InnerQ, Duplicates )
    SELECT Data_detailed_merged_duplicates.sample_year,
        Data_detailed_merged_duplicates.Cell_ID,
        Data_detailed_merged_duplicates.Species_ID,
        Data_detailed_merged_duplicates.MaxOfa,
        Data_detailed_merged_duplicates.MaxOfb,
        Data_detailed_merged_duplicates.MaxOfc,
        Data_detailed_merged_duplicates.MaxOfd,
        Data_detailed_merged_duplicates.MaxOfe,
        Data_detailed_merged_duplicates.MaxOff,
        Data_detailed_merged_duplicates.MaxOfg,
        Data_detailed_merged_duplicates.MaxOfh,
        Data_detailed_merged_duplicates.MaxOfInnerQ,
        0 AS Expr1
    FROM Data_detailed_merged_duplicates;
    
    最后,我删除了之前用另一个查询标记的所有重复记录(现在它们至少是三个,但只有一个未标记):

    DELETE Data_detailed.*, Data_detailed.Duplicates
    FROM Data_detailed
    WHERE (((Data_detailed.Duplicates)=True));
    
    因此,我将合并所有记录,而不创建临时表

    所有这些过程都封装在一个宏中,因此我不必查找所有这些查询并逐一应用它们:


    这是一个一次性纠正数据的过程,还是一个持续的重复过程?看起来不像一个规范化的数据结构。@June7这个过程应该在同一张表上定期进行,每年一次。我知道我可以创建具有所需结果的新表,但我需要更新同一个表,因为它连接到其他几个查询和表单。数据结构是标准化的,因此我有另一个表,用于
    Cell\u ID
    Species\u ID
    以及包含“幼苗”和“成虫”的所有列的可能状态。所有表都是通过具有引用完整性的关系连接的。结构看起来仍然没有完全规范化。多个类似的字段就是一个指标。列a、b、c、d看起来像是相同类型的数据。d之后是否有更多的alpha序列字段名?@June7列
    a
    h
    以及
    InnerQ
    (您可以在第二次查询中看到它们的列表)是来自不同空间位置的数据。我知道我可以使用一列作为位置,然后将所有这些数据放在同一列中。这就是我的主数据表的结构,但是这个表填充了一个特定的表单,它需要这个结构来并行输入每个细胞和物种的所有位置。您将如何构造此表?似乎规范化需要位置详细信息的相关依赖表。不管怎样,为什么要删除原始数据?为什么要改变数据而不仅仅是查询?无法更新和删除同一sql中的记录,我使用聚合查询更新表的每次尝试都失败。因此,建议您保存到“temp”表,从原始表中删除记录,然后运行INSERT SELECT重新填充原始表。这避免了必须删除和重命名数据库设计编辑的表。
    INSERT INTO Data_detailed ( sample_year, Cell_ID, Species_ID, a, b, c, d, e, f, g, h, InnerQ, Duplicates )
    SELECT Data_detailed_merged_duplicates.sample_year,
        Data_detailed_merged_duplicates.Cell_ID,
        Data_detailed_merged_duplicates.Species_ID,
        Data_detailed_merged_duplicates.MaxOfa,
        Data_detailed_merged_duplicates.MaxOfb,
        Data_detailed_merged_duplicates.MaxOfc,
        Data_detailed_merged_duplicates.MaxOfd,
        Data_detailed_merged_duplicates.MaxOfe,
        Data_detailed_merged_duplicates.MaxOff,
        Data_detailed_merged_duplicates.MaxOfg,
        Data_detailed_merged_duplicates.MaxOfh,
        Data_detailed_merged_duplicates.MaxOfInnerQ,
        0 AS Expr1
    FROM Data_detailed_merged_duplicates;
    
    DELETE Data_detailed.*, Data_detailed.Duplicates
    FROM Data_detailed
    WHERE (((Data_detailed.Duplicates)=True));