在 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 中,如何以多对多关系列出记录,以使所列出的表中的记录不重复?的主要内容,如果未能解决你的问题,请参考以下文章