【问题标题】:SQL: Group BY in Union Vs Group BY in Union AllSQL:Union 中的 Group BY 与 Union All 中的 Group BY
【发布时间】:2018-06-04 17:48:47
【问题描述】:

在 SQL 中,我无法决定是使用 Union 还是 Union All 在 Union All 中使用 Group By 消除重复记录?还是建议将 Union 与 Group By 一起使用

【问题讨论】:

  • 您使用的是什么数据库(例如 MySQL、SQL Server 等)?在每种情况下正确的做法将取决于此。无论如何,您可能都可以尝试两种方式并查看说明计划。
  • 一切都取决于你想做什么。向我们展示数据库架构、示例数据、当前和预期输出。请阅读How-to-Ask 这里是START 了解如何提高问题质量并获得更好答案的好地方。
  • 你使用你需要/想要的。如果可能(即两者都返回相同的结果)union all 应该使用,因为它不是 DISTINCT。
  • UNION 消除重复 UNION ALL 保持重复
  • SQL Server 2016,我想要不同的结果。因为 UNION ALL 在性能上比 UNION 更好。我可以使用 Group BY 和 UNION ALL 来获得不同的结果吗?

标签: sql sql-server sql-server-2016


【解决方案1】:

答案有点微妙。据我了解,UNION 将删除您的第一个查询和联合后运行的后续查询之间的重复项。但是,如果您的第一个数据集包含重复项,我相信这些不会被删除。

当您尝试聚合某些数据时,更常使用 Group By。例如,对于 Sum()、Min() Max(),这种类型的东西。如果您不进行任何聚合,则不需要 group by()。如果您在联合中的一个或多个查询中进行聚合,则需要 UNION 和 Group By。

最后,如果您想消除所有重复项,并且您在第一个查询中没有任何聚合但您看到重复项,您还可以在第一个查询中抛出一个 distinct,这将从您的初始数据集中消除它们也是。

【讨论】:

  • UNION 删除所有重复项,无论它们来自何处。
  • 他的问题只是在执行 UNION 时消除了重复项。有时人们会在没有聚合函数的情况下对所有列进行 GROUP BY 来删除重复项。根据数据库和列统计信息,这可能会更有效。
  • @Error_2646:但声称 UNION 不会删除其中一个查询中出现的重复项仍然是错误的。对于现代 DBMS 来说,所有列上的 GROUP BY 都比 DISTINCT (或联合)更有效
  • @a_horse_with_no_name 我不认为我提出了这个要求。此外,我对 Teradata 的了解还不够深入,无法与之交谈,但在某些情况下,对所有列的 group by 绝对比 distinct 更快,即当大多数记录重复时。
  • @Error_2646:关于 Teradata,这个选择通常由优化器完成,不管你写的是 DISTINCT 还是 GROUP BY。
【解决方案2】:

GROUP BY 将消除每个子查询中的重复项,但 UNION 将消除子查询中的重复项。例如,这只会在 ClientList1 和 ClientList2 表中给出唯一的名称:

SELECT [Name] FROM ClientList1 GROUP BY [Name]
UNION
SELECT [Name] FROM ClientList2 GROUP BY [Name]

但这将包括两个表中都存在的名称:

SELECT [Name] FROM ClientList1 GROUP BY [Name]
UNION ALL
SELECT [Name] FROM ClientList2 GROUP BY [Name]

【讨论】:

    【解决方案3】:

    UNIONUNION ALL 之间进行选择的基础是UNION 需要更长的时间,但可以删除一些重复项。如果您希望不会有 UNION 将删除的重复项,或者可以在输出中包含这些重复项,请使用 UNION ALL

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-08-09
      • 1970-01-01
      • 2015-03-22
      • 2012-09-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多