【问题标题】:SQL stream sort multiple tables togetherSQL流将多个表排序在一起
【发布时间】: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 个表的结果组合/排序在最后。
  • 我会发布一个答案,以便您可以明智地查看代码 - 然后您将能够确定它是否满足您的需求
  • 表格未排序。它们代表无序(多)集。

标签: sql sorting


【解决方案1】:
;WITH cte AS
(
    SELECT TOP 50 [time], [name], [age]
    FROM [table1]
    -- ORDER BY [time] -- uncomment the ORDER BY if [time] is not the PK or default index
    UNION ALL
    SELECT TOP 50 [time], [name], [age]
    FROM [table2]
    -- ORDER BY [time] -- ditto
    UNION ALL
    SELECT TOP 50 [time], [name], [age]
    FROM [table3]
    -- ORDER BY [time] -- ditto
)
SELECT
    TOP 50
    [time], [name], [age]
FROM cte
ORDER BY [time];

我假设 [time] 将被适当地索引,以便 CTE 中的各个 SELECT 将快速运行。因此,通过在 CTE 中拥有最多 150 条记录,然后从中选择 TOP 50,无论(例如)[table2] 是否实际上具有最低 50 个 [time] 值,或者它们是否均匀分布在3 张桌子。

这是我对您想要实现的目标的解释。

【讨论】:

  • 问题,如果3个表各有1000万,这个过程会先提取然后合并整个3000万,然后排序,然后给我结果对吗?所以在我得到任何结果之前,它必须先检查所有数据?同样,我不只是获得前 X 数据,我想对整个数据进行排序。我选择 50 数字的唯一原因只是因为我想立即获得一些结果而不首先对所有数据进行排序/合并,但最终我希望对所有数据进行排序/合并,而不仅仅是获得一小部分数据
猜你喜欢
  • 2022-01-09
  • 1970-01-01
  • 1970-01-01
  • 2015-09-13
  • 2013-11-10
  • 1970-01-01
  • 2013-09-14
  • 2012-05-21
  • 1970-01-01
相关资源
最近更新 更多