在 MS Access 中,如何以多对多关系列出记录,以使所列出的表中的记录不重复?

Posted

技术标签:

【中文标题】在 MS Access 中,如何以多对多关系列出记录,以使所列出的表中的记录不重复?【英文标题】:In MS Access, how do I list records in a many-to-many relationship such that records in the table being listed are not repeated? 【发布时间】:2015-06-04 13:38:53 【问题描述】:

与大多数数据库一样,在 Access 中,我可以使用 JOIN 来查询多对多关系:

SELECT Books.Title, Tags.Subject 
FROM Tags
   RIGHT JOIN (Books 
               LEFT JOIN BookTags
               ON Books.ID = BookTags.BookID) 
   ON Tags.ID = BookTags.TagID; 


-------Books.Title--------------+---Tags.Subject-------
 Nineteen Eighty Four           |    science fiction   
 Nineteen Eighty Four           |    dystopian themes
 Freakonomics                   |    non-fiction
 Freakonomics                   |    economics
 The C Programming Language     |    textbook
 The C Programming Language     |    programming
 The C Programming Language     |    non-fiction

我想要一个表格,只列出每本唯一的书一次,并且该书的所有作者都在同一行。像这样的:


十九八十四 - 科幻、反乌托邦主题

Freakonomics - 非小说,经济学

C 编程语言 - 教科书、编程、非小说类


它在 Windows 窗体中看起来有点不同,但你明白了:我希望每本书只有一行,每本书的行上都列出了该书的标签。

我相信你们中的一些人会建议打破数据规范化规则,我并不完全反对,因为这是我用来跟踪我所做工作的个人数据库。 (它与书籍无关,但书籍是一个更简单的例子)。话虽如此,我不希望使用 Access 专有的数据类型,以防我需要迁移到其他软件。

【问题讨论】:

右连接,左连接...大多数人迷失在右连接。 @jarlh 英文:返回所有书籍,无论书籍在 BookTag 表中是否有匹配条目 我知道,但大多数人的做法恰恰相反,首先是“主要”表。像 Books LEFT JOIN BookTags 之类的东西左加入标签。 【参考方案1】:

您可以使用 Allen Browne 的 Concatenate Related 函数。您的设置非常适合 Allen 描述的功能。

复制代码后,可以使用Query as,

SELECT 
    Books.Title, 
    ConcatRelated("Subject", "BookTags", "BookID = " & Books.ID) 
FROM 
    Books;

【讨论】:

以上是关于在 MS Access 中,如何以多对多关系列出记录,以使所列出的表中的记录不重复?的主要内容,如果未能解决你的问题,请参考以下文章

如何让所有学生以多对多关系注册到特定课程列表中(1 和 2)

MS Access 多对多关系

MS Access 的多对多关系问题

iphone, 以多对多关系保存数据, 核心数据

Spring 数据存储库不会以多对多关系保存数据

以多对多关系对相关集进行排序