我正在处理一个 MS Access 2016 数据库,其中包含有关一系列食谱书的信息。我有几个用于存储不同类型数据的表,这些表使用多对一和多对多关系相互链接。然后,我想通过查询导出每本书的“结果表”(Excel 格式),其中包含食谱名称、页码、配料、“配套”配料、器具和注释的列表。输出应该是这样的:
我尝试通过 Access 中的报告工具执行此操作,并将“隐藏重复”控件设置为“是”。问题是,当我生成报告时,数据不断重复,如下所示:
我的问题是,是否有办法做我想做的事情,或者类似的事情,而不必逐个修改每个表,因为我有 70 多本书和 7000 多个食谱。我的查询子模式如下:
生成的 SQL:
SELECT N_recetas.no_libro, N_recetas.Id, N_recetas.nombre_receta, N_recetas.pag, N_ingredientes.ingrediente, N_acompanamientos.nombre_acomp, N_utensilios.utensilio, N_recetas.notas
FROM N_utensilios
RIGHT JOIN ((((N_libros INNER JOIN N_recetas ON N_libros.no_libro = N_recetas.no_libro) LEFT JOIN (N_acompanamientos RIGHT JOIN rels_rec_acomp ON N_acompanamientos.Id = rels_rec_acomp.Id_acompanamiento_Fk) ON N_recetas.Id = rels_rec_acomp.Id_receta_FK) LEFT JOIN rels_rec_utensilios ON N_recetas.Id = rels_rec_utensilios.IdRecetaFK) INNER JOIN (N_ingredientes INNER JOIN rels_rec_ings ON N_ingredientes.id_ingrediente = rels_rec_ings.Id_ingrediente_FK) ON N_recetas.Id = rels_rec_ings.Id_receta_FK) ON N_utensilios.Id = rels_rec_utensilios.IdUtensilioFK
WHERE (((N_recetas.no_libro)=78));
答案1
在数据库中,每行必须包含该列的所有信息。每行都独立于所有其他行。您不能在此处使用类似 Excel 的结构。
这里第二行不包含有关 ID、nombre_receta、pag 等的信息,这就是它显示为独立行的原因。
您还应该在第二行写下其他列的信息。
您的行应如下所示:
UniqueID,8154, Batidillo, 22, Sal, Tortillas
UniqueID,8154, Batidillo, 22, Sal, Guajes
并且唯一ID将成为主键并且应该是不同的。
然后您就可以查询您的数据库。
如果您认为每行中的信息都是重复的,那么可以考虑对重复信息使用不同的表,并创建一个包含该表的行 ID 的列。
请参阅此处的“非规范化形式的示例数据”部分以熟悉。https://support.office.com/en-us/article/move-data-from-excel-to-access-90c35a40-bcc3-46d9-aa7f-4106f78850b4