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));