我正在开发一个应用程序,允许用户从多个"页面"构建"书",然后按他们想要的任何顺序放置它们。多个人可以构建同一本书(以相同的顺序构建相同的页面(。这些书是由用户在处理和打印之前构建的,所以我需要将具有相同确切布局(相同页面以相同顺序(的书籍分组在一起。我一生中写了一百万个查询,但由于某种原因,我无法掌握如何做到这一点。
我可以简单地编写一个大的 SELECT 查询,然后遍历结果并构建具有相同页面的相同序列的对象数组,但我试图弄清楚如何使用一个查询来做到这一点。
这是我的数据布局:
dbo.Books
BookId
Quantity
dbo.BookPages
BookId
PageId
Sequence
dbo.Pages
PageId
DocName
因此,我需要澄清一些事情:
- 一旦用户按照他们想要的方式对页面进行排序,它们是否会保存回数据库?
- 如果是,那么问题是否要运行查询以对具有相同页码的图书订单进行分组,以便以最佳方式将它们发送到打印机?
- 或者,用户是否布局页面,然后将订单直接发送到打印机?如果是这样,捕获请求的打印作业并在发送到打印机的途中即时订购它们似乎更复杂/效率更低......
- 你使用什么语言/技术来创建此解决方案?.NET?爪哇岛?
有了这些问题的答案,我可以更好地衡量您的需求。
有了我的问题的答案,我还假设:
- 您正在使用某种类型的多对多表来存储客户页面排序。如果是这样,则需要编写查询以选择不同的页面顺序,并按这些页面顺序进行分组。这可以通过单个 SQL 查询来实现。
- 但是,如果您觉得希望更好地控制此数据的联接方式,则以编程方式执行此操作可能是要走的路,尽管读取所有数据,然后以打印机可以使用的方式输出该数据会降低性能。
仅当页数 = 匹配计数时,书籍才相同。
当我开始时,它被标记为TSQL。 这可能与 SQL 上的语法不同。
;WITH BookPageCount
AS
(
select b1.bookID, COUNT(*) as [individualCount]
from book b1 with (nolock)
group by b1.bookID
),
BookCombinedCount
AS
(
select b1.bookID as [book1ID], b2.bookID as [book2ID], COUNT(*) as [combindCount]
from book b1 with (nolock)
join book b2 with (nolock)
on b1.bookID < b2.bookID
and b1.squence = b2.squence
and b1.page = b2.page
group by b1.bookID, b2.bookID
)
select BookCombinedCount.book1ID, BookCombinedCount.book2ID
from BookCombinedCount
join BookPageCount as book1 on book1.bookID = BookCombinedCount.book1ID
join BookPageCount as book2 on book2.bookID = BookCombinedCount.book2ID
where BookCombinedCount.combindCount = book1.individualCount
and BookCombinedCount.combindCount = book2.individualCount.PageCount