我是Access的新手,我有一张桌子有AuthorName
,BookTitle
和CoAuthor
。 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
如果可能,我希望它(动态)读取
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有关吗?
您所要求的是违反使用关系数据库的全部要点;简而言之,您应该以最小化(而不是消除)重新设计表的需要的方式设计表。我建议你读一下database normalization。
事实上,你的问题是我在教授数据库时经常使用的一个例子:你如何设计一个数据库来保存有关书籍和作者的所有信息。场景是:
所以,这是一个多对多的关系,并且有一种设计这样一个数据库的方法。
首先,为作者设计一个表格:
然后,为书籍设计一个表格:
最后,需要第三个表来关联作者和书籍:
(两个字段必须是主键的一部分)
现在,主要问题是:如何查询书籍及其作者?
假设以上设计,您可以编写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
为什么这个设计比你原来的想法更好?
进一步阅读:
次要更新
这种设计将帮助您避免将来遇到很多麻烦,因为每次添加第三或第四作者时都不需要更改表格。几年前我了解了数据库规范化,阅读了Jon Viescas的“Running Access 97”(这不是商业广告,它只是一个参考文献;))...一本旧书,是的,但它对这个主题有很好的介绍。
现在,在对数据库进行规范化之后,您可以使用数据透视查询来获取所需内容(如The Access Web中所述)。
如果您的表格类型如下
"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;