【发布时间】:2021-07-10 02:06:37
【问题描述】:
假设我有多个表,为简单起见假设有 3 个表。每个表都有相同数量的列/数据类型并且已经排序。对于这个例子,假设它按列时间排序。我想查询每个表并将它们合并排序并以块或流的形式获取结果。我说流式传输,因为假设这 3 个表非常大,所以想在不先对整个事物进行排序的情况下获得一些结果
例如,假设我们有表格
表1
time | name | age
1 | carl | 15
4 | karl | 16
11 | john | 23
表2
time | name | age
2 | jess | 10
4 | kara | 20
9 | mike | 30
表3
time | name | age
3 | sara | 15
5 | pam | 25
7 | sam | 35
结果
time | name | age
1 | carl | 15
2 | jess | 10
3 | sara | 15
4 | karl | 16
4 | kara | 20
5 | pam | 25
7 | sam | 35
9 | mike | 30
11 | john | 23
查询块,比如将每个块限制为 50,然后是 UNION,然后是 SORT,似乎效率低下。另外,如果 table1 的时间比 table2 和 table3 的时间早得多,那么这将不起作用。
【问题讨论】:
-
我知道您正在使用一个非常简单的示例来尝试和演示 - 但有时最好更好地了解您正在使用的 3 个表的结构,并了解背后的业务案例需要合并数据。也就是说,如果您的基础表在适当的列上建立索引,那么您可以从 (SELECT TOP 50 * FROM table1 UNION ALL SELECT TOP 50 * FROM table2 UNION ALL SELECT TOP 50 * FROM table3) 构建 CTE,然后选择 TOP 'x' 量,您需要从 CTE 获得的适当订购量。性能应该没问题
-
虽然,您还没有具体说明所需的行数是始终相同(即 50)还是可变数。而且您还没有指定是否会有某些 WHERE 子句标准也适用。添加任何这些因素都会略微增加复杂性
-
使用您的解决方案,您将如何获得第二个 50 以及其余的?我只选择了任意数量的 50,但我最终希望将整个 3 个表的结果组合/排序在最后。
-
我会发布一个答案,以便您可以明智地查看代码 - 然后您将能够确定它是否满足您的需求
-
表格未排序。它们代表无序(多)集。