【问题标题】: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?在 MS Access 中,如何以多对多关系列出记录,以使所列出的表中的记录不重复?
【发布时间】: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 之类的东西左加入标签。

标签: sql winforms ms-access vba


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2014-05-08
    • 1970-01-01
    • 1970-01-01
    • 2016-10-28
    • 1970-01-01
    • 2018-02-18
    • 1970-01-01
    • 1970-01-01
    • 2022-01-28
    相关资源
    最近更新 更多