假设我有一个Library
数据库和以下表格:
Books(ID, Title, Author, PublihserID, LanguageCode, Genre, DatePublished, ISBN)
- 包含作为抽象项目、智力工作的书籍示例
ID | 标题 | 作者 | 发布者 ID | 语言代码 | 类型 | 发布日期 | 国际标准书号 |
---|---|---|---|---|---|---|---|
1 | 尼罗河上的死亡 | 阿加莎克里斯蒂 | 2 | CN | 小说 | 1937-11-01 | 4215574186436 |
Branches(ID, Name, City, Address)
- 包含不同城市的图书馆分馆
ID | 姓名 | 城市 | 地址 |
---|---|---|---|
1 | 名称1 | 伦敦 | 地址1 |
2 | 名称2 | 伯明翰 | 地址2 |
3 | 名称3 | 曼彻斯特 | 地址3 |
BookCopies(ID, BookID, BranchID, Condition)
- 包含作为物理项目的书籍以及它们所在的分支
ID | 书号 | 分行 ID | 健康)状况 |
---|---|---|---|
3aa99df2-7a88-4ca8-a965-046f478ac9f3 | 1 | 1 | 较差的 |
34beeffa-14c9-4796-a61c-0477be59af0f | 1 | 1 | 出色的 |
1dc0e7cd-0f9e-42b2-829a-04de9a77ae47 | 1 | 2 | 平均 |
88f0045c-3910-4fd6-9a29-078c2d48bfb8 | 1 | 2 | 好的 |
ea3aafe9-0ada-4396-9ed3-0867912b7958 | 1 | 2 | 较差的 |
6d003fd5-83e7-4df5-9aa8-08dd61d53eb2 | 1 | 3 | 出色的 |
... | ... | ... | ... |
我想写一个查询,它为每一本书Books
显示图书馆的每个分支中有多少本书的物理副本。到目前为止,我在数据库中的数据有三个带有ID1
和. 我编写了以下查询,它正确显示了我想要的内容(添加了一些额外的内容,例如作者 Agatha Christie 的过滤):2
3
SELECT
Books.Title,
Books.PublisherID,
Books.DatePublished,
Books.ISBN,
r1.Branch1,
r1.Branch2,
r1.Branch3
FROM
Books
JOIN
(SELECT
copies.BookID,
br1.Branch1,
br2.Branch2,
br3.Branch3
FROM
BookCopies copies
JOIN
(SELECT
BookCopies.BookID,
COUNT(BookCopies.BranchID) AS Branch1
FROM
BookCopies
GROUP BY BookCopies.BookID, BookCopies.BranchID
HAVING BookCopies.BranchID=1) br1
ON copies.BookID=br1.BookID
FULL JOIN
(SELECT
BookCopies.BookID,
COUNT(BookCopies.BranchID) AS Branch2
FROM
BookCopies
GROUP BY BookCopies.BookID, BookCopies.BranchID
HAVING BookCopies.BranchID=2) br2
ON copies.BookID=br2.BookID
FULL JOIN
(SELECT
BookCopies.BookID,
COUNT(BookCopies.BranchID) AS Branch3
FROM
BookCopies
GROUP BY BookCopies.BookID, BookCopies.BranchID
HAVING BookCopies.BranchID=3) br3
ON copies.BookID=br3.BookID
GROUP BY copies.BookID, br1.Branch1, br2.Branch2, br3.Branch3) r1
ON Books.ID=r1.BookID
WHERE Books.Author='Agatha Christie'
标题 | 出版商 | 发布日期 | 国际标准书号 | 分支1 | 分支2 | 分支3 |
---|---|---|---|---|---|---|
尼罗河上的死亡 | 2 | 1937-11-01 | 4215574186436 | 2 | 3 | 1 |
... | ... | ... | ... | ... | ... | ... |
但是这样的查询有两个基本问题:
- 我敢肯定它真的很慢,效率低下并且充满了不良做法
- 它针对三个分支进行了硬编码。如果图书馆开设第四,第五等分店,它就行不通了。
如何改进我的查询,使其适用于所有分支(无论它们的数量),并且最好有效地使用资源?