【问题标题】:Recursive Common Table Expressions: why use UNION ALL? [duplicate]递归公用表表达式:为什么使用 UNION ALL? [复制]
【发布时间】:2020-02-15 23:01:13
【问题描述】:

递归 CTE 包括锚查询和递归查询。锚选择一行或多行开始,递归选择其余行。这些行与UNION ALL 子句组合在一起。

如果两个内部查询不返回相同的行,为什么需要将它们与 UNION ALL 子句组合,而不仅仅是 UNION ?据我所知,UNION ALL 的目的是包含重复的行。

这似乎是 Microsoft SQL 的要求,但不是 PostgreSQL。

或者图片还有更多内容?

感谢@MartinSmith 的评论,这似乎在Why does a Recursive CTE in Transact-SQL require a UNION ALL and not a UNION? 中得到了回答

我投票结束这个问题。

【问题讨论】:

  • 对于 SQL Server,它可能只是不允许 UNION 因为这不适用于 how they are implemented 它一次处理一行递归 CTE,然后一直向下直到该路径接受它。一次不是一个级别。您可以添加 DISTINCT 或类似的 on 以对整个结果或其他一些标准执行不同的操作,但语义不完全相同
  • 仅供参考,您的链接问题中的以下评论很有帮助。它还指出 UNION 在其他 SQL 中是允许的,但在 Microsoft 中是不允许的。 dba.stackexchange.com/questions/226946/…
  • 这个问题和这个问题有区别吗? stackoverflow.com/q/47998833/73226
  • @MartinSmith 感谢您采用更温和的方法来标记重复项。另一个问题确实回答了这个问题。我会关闭这个。
  • 很酷,因为如果不立即关闭 Q 我想确保我没有遗漏任何东西,我就不能像骗子一样投票

标签: sql sql-server postgresql common-table-expression recursive-query


【解决方案1】:

你说“只是UNION”。一般来说,你的想法应该是“只是UNION ALL”。

UNION 会产生额外的删除重复行的开销。如果您确实想删除重复项,您只想承担该开销。默认值应始终为UNION ALL,除非您需要额外的操作。

【讨论】:

  • 其实“只是UNION”。鉴于理论结果应该是一个集合,并且集合没有重复,无论如何这将是预期的行为。这就是为什么,例如你不能UNION 一个有序的SELECT 语句;只能订购结果。无论如何,这并不能解释为什么需要UNION ALL,即使两个内部查询是不相交的。
  • @Manngo 。 . .理论很好。大多数人都希望他们的查询也能以最佳方式执行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-05
  • 1970-01-01
  • 1970-01-01
  • 2018-06-08
  • 1970-01-01
  • 2019-12-07
  • 1970-01-01
相关资源
最近更新 更多