从行Access 2010动态创建列

use*_*282 1 sql ms-access vba access-vba

我是比较新的访问,我有里有桌子AuthorName,BookTitleCoAuthor. AuthorName并且BookTitle是一个复合键.

目前查询提取的信息如下:

AuthorName---------BookTitle------CoAuthor

Steven King--------Dark Half------Peter Straub

Steven King--------Dark Half------John Doe

James Patterson----Another Time

Jeff Hanson--------Tales of Time---Joe Smith
Run Code Online (Sandbox Code Playgroud)

如果可能,我希望它(动态)读取

AuthorName---------BookTitle---------CoAuthor1--------CoAuthor2

Steven King----------Dark Half--------Peter Straub-----Joe Doe

James Patterson----Another Time

Jeff Hanson----------Tales of Time----Joe Smith
Run Code Online (Sandbox Code Playgroud)

因此,如果稍后添加了另一位作者,则会出现CoAuthor的第三列.

这可能与VBA或SQL有关吗?

Bar*_*nka 5

您所要求的是违反使用关系数据库的全部要点; 简而言之,您应该以最小化(而不是消除)重新设计表的需要的方式设计表.我建议你阅读有关数据库规范化的内容.

事实上,你的问题是我在教授数据库时经常使用的一个例子:你如何设计一个数据库来保存有关书籍和作者的所有信息.场景是:

  • 一本书可以有一个或多个作者
  • 作者可能已经写了一本或多本书

所以,这是一个多对多的关系,并且有一种设计这样一个数据库的方法.

首先,为作者设计一个表格:

  • tbl_authors
    • author_idd(主键,数字,首选自主数字)
    • first_name(String)
    • last_name(String)

然后,为书籍设计一个表格:

  • tbl_books
    • book_id(主键,数字,首选自主数字)
    • book_title(String)

最后,需要第三个表来关联作者和书籍:

  • tbl_books_authors
    • book_id(主键,数字)
    • author_id(主键,数字)
    • main_author(布尔值:如果是主作者,则为"是",否则为"否")

(两个字段必须是主键的一部分)

现在,主要问题是:如何查询书籍及其作者?

假设上述设计,您可以编写SQL查询以获取书籍及其作者的完整列表:

select book_title, first_name, last_name
from 
    tbl_authors as a
    inner join tbl_books_authors as ba on a.authorId = ba.authorId
    inner join tbl_books as b on ba.bookId = b.bookId
Run Code Online (Sandbox Code Playgroud)

这样,你会有这样的事情:

book_title | first_name | last_name
-----------+------------+-----------
book1      | John       | Doe
book1      | Jane       | Doe
book2      | John       | Doe
book2      | Peter      | Who
book3      | Jane       | Doe
book4      | Peter      | Who
book5      | John       | Doe
book5      | Jane       | Doe
book5      | Peter      | Who
book5      | Jack       | Black
Run Code Online (Sandbox Code Playgroud)

为什么这个设计比你原来的想法更好?

  • 因为您不需要更改表的结构来添加其他作者
  • 因为你不知道先验多少作家一本书可以有
  • 因为您可以避免数据库中的冗余
  • 因为通过这种设计,您将能够使用前端工具(如Access表单和报表或其他工具)来创建几乎任何来自此数据的排列.

进一步阅读:


次要更新

这种设计将帮助您避免将来遇到很多麻烦,因为每次添加第三或第四作者时都不需要更改表格.几年前我了解了数据库规范化,阅读了Jon Viescas的"Running Access 97"(这不是商业广告,它只是一个参考文献;))...一本旧书,是的,但它对这个主题有很好的介绍.

现在,在对数据库进行规范化之后,您可以使用数据透视查询来获取所需内容(如Conrad Frix发布答案中所述).