从行Access 2010动态创建列

问题描述 投票:1回答:2

我是Access的新手,我有一张桌子有AuthorNameBookTitleCoAuthorAuthorNameBookTitle是复合键。

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

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

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

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

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

James Patterson----Another Time

Jeff Hanson----------Tales of Time----Joe Smith

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

这可能与VBA或SQL有关吗?

sql vba ms-access access-vba
2个回答
5
投票

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

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

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

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

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

  • 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

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

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

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

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

进一步阅读:

  • qazxsw poi(特别是qazxsw poi)

次要更新

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

现在,在对数据库进行规范化之后,您可以使用数据透视查询来获取所需内容(如The Access Web中所述)。


3
投票

如果您的表格类型如下

"The Ten Commandments of Access"

这将是一个非常简单的转变

answer posted by Conrad Frix

因为它不需要通过首先为模拟+-----------------+---------------+--------------+-----------+ | AuthorName | BookTitle | CoAuthor | Type | +-----------------+---------------+--------------+-----------+ | Steven King | Dark Half | Peter Straub | CoAuthor1 | | Steven King | Dark Half | John Doe | CoAuthor2 | | James Patterson | Another Time | | CoAuthor1 | | Jeff Hanson | Tales of Time | Joe Smith | CoAuthor1 | +-----------------+---------------+--------------+-----------+ 然后转换的每一行分配一个数字来动态创建它。在大型数据集上,这可能非常慢

TRANSFORM First(Books.CoAuthor) AS FirstOfCoAuthor
SELECT Books.AuthorName, Books.BookTitle
FROM Books
GROUP BY Books.AuthorName, Books.BookTitle
PIVOT Books.Type;
© www.soinside.com 2019 - 2024. All rights reserved.