自我加入和子查询的CTE

时间:2015-12-15 20:52:56

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

CTE相对于自联接和子查询有什么优势。 我们可以使用CTE实现使用自联接/子查询实现的任何功能。想知道除了简单的cte语法之外,使用cte比使用cte语法有什么好处!?

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:-1)

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

所以说我需要一份关于符合某个标准的一系列订单的所有技术信息的报告。由于信息将被求和,因此最终结果应与您查询订单表时获得的记录数相同。所以你从一个只获得你想要的订单的CTE开始。您可以从中进行简单的选择,并找到符合条件的37个订单。现在您知道您的最终结果应该是什么,并且当您使查询变得越来越复杂时,您可以轻松地检查您是否出了问题。

所以现在我需要每个订单中各个项目的总和。也许是因为它们存储在多个表中(比如说服务和商品是否在单独的表中),那么你需要一个联盟来获得总和。这就成了第二个CTE。

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

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

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

当然@TabAllerman关于递归的说法。