【问题标题】:CTE over self join and sub queries [closed]CTE 通过自联接和子查询 [关闭]
【发布时间】:2015-12-15 20:52:55
【问题描述】:

CTE 与自联接和子查询相比有哪些优势。 我们可以使用自连接/子查询实现的任何东西都可以通过使用 CTE 来实现。想知道除了简单的 cte 语法之外,使用 cte 比那些提到的方法有什么好处!?

【问题讨论】:

  • 一些具体的例子会有所帮助。否则,问题就很广泛了。
  • CTE 超过自我加入是什么意思?请张贴一个例子。而且我认为您的意思是派生表 - 不是子查询

标签: sql sql-server sql-server-2008 sql-server-2008-r2


【解决方案1】:

CTE 允许轻松创建导航父子结构的递归查询。

【讨论】:

    【解决方案2】:

    当查询真正复杂时(想想可能有 5-6 个派生表和大约 20 个连接和 7 个或更多 where 条件,您知道 - 企业环境中的平均报告查询),那么 CTE 有助于更轻松地了解正在发生的事情,从而使查询更易于维护。当事物以复杂的方式协同工作时,它们还可以使获得实际正确结果变得更加简单。

    假设我需要一份关于一组符合特定标准的订单的所有技术信息的报告。由于信息将被求和,因此最终结果应该与您仅查询订单表时获得的记录数相同。因此,您从只获得您想要的订单的 CTE 开始。然后您从中进行简单的选择,发现有 37 个订单符合条件。现在您知道您的最终结果应该是什么,并且随着查询变得越来越复杂,您可以轻松检查以确保您没有出错。

    所以现在我需要每个订单中各个项目的总和。可能是因为它们存储在多个表中(例如,如果服务和商品位于不同的表中),那么您有一个需要获取总和的联合。所以这成为第二个 CTE。

    现在您需要订单的联系人,但有些订单关联了多人,您必须通过添加一些条件来找到主要联系人。所以现在你有了第三个 CTE。

    那么您有两个收货地址,那么您需要将两个收货地址连接在一起,还是应该将每个收货地址作为单独的记录?此时,通过使用多个 CTE 来继续添加数据块会更容易,当您到达最终查询时,它相对简单,因为所有复杂性都在单个块中。

    一年后,当有人需要更改确定一块信息的业务规则时,您可以只更改那一部分,并且更加确信它不会影响其他部分的协同工作方式。更容易维护。

    当然还有@TabAllerman 所说的递归。

    【讨论】:

      猜你喜欢
      • 2016-02-18
      • 2011-08-14
      • 2018-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多