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