Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
正在寻找具有相互依赖的临时表的WITH SQL语句的替代方案_Sql_Sql Server - Fatal编程技术网

正在寻找具有相互依赖的临时表的WITH SQL语句的替代方案

正在寻找具有相互依赖的临时表的WITH SQL语句的替代方案,sql,sql-server,Sql,Sql Server,我正在处理一个包含许多表的大型数据库。我有一种工作版本,与;使用语句,但它对整个数据库有副作用,有时会停止或减慢ETL作业,因此我正在寻找替代方法 我试图重写查询,但后来得到了答案 无法绑定多部分标识符x 因为这两张桌子是相互依存的 工作版本的类型为: 使用[数据库] ;以[表1]为例 选择[RegionList]。[Cluster] ,[RegionList]。[Region] ,[客户] ,[Key1] ,[Key2] ,MAX…[TimeK]。作为[时间] 摘自[表3] 在[RegionL

我正在处理一个包含许多表的大型数据库。我有一种工作版本,与;使用语句,但它对整个数据库有副作用,有时会停止或减慢ETL作业,因此我正在寻找替代方法

我试图重写查询,但后来得到了答案

无法绑定多部分标识符x

因为这两张桌子是相互依存的

工作版本的类型为:

使用[数据库] ;以[表1]为例 选择[RegionList]。[Cluster] ,[RegionList]。[Region] ,[客户] ,[Key1] ,[Key2] ,MAX…[TimeK]。作为[时间] 摘自[表3] 在[RegionList].[Region]=[DRegion].[Region]上加入[RegionList] 在[table3].[TimeK]=[DTime].[TimeK]上加入[DTime] 在[table3].[Key2]=[PKey].[Key2]上加入[PKey] 分组依据[RegionList]。[Cluster] ,[RegionList]。[Region] ,[客户] ,[Key1] ,[Key2] ,[表2]如下: 选择[表3]。[名称] ,[D产品][产品] ,[PKey]。[Key2] 案例 当[table1].[time]为空时,则[DProduct].[Product] 什么时候 否则无效 结束为[不活动] 摘自[表1] 在[table1].[Key1]=[DProduct].[Key1]上加入[DProduct] 在[table3].[Key2]=[PKey].[Key2]上加入[PKey] 在[table3].[Name]=[DName].[Name]上加入[Name] 选择[table2]。[NotActive] ,[表2]。[名称] ,[表1]。[时间] ,[表1][地区] 摘自[表2] 在[table1].[Key2]=[table2].[Key2]上加入[table1] 其中[NotActive]不为空 需要更改数据中的名称,因此如果出现错误,则是因为抄本

我想重写它,所以我:

使用[数据库] 选择[table2]。[NotActive] ,[表2]。[名称] ,[表1]。[时间] ,[表1][地区] 从…起 选择[RegionList]。[Cluster] ,[RegionList]。[Region] ,[客户] ,[Key1] ,[Key2] ,MAX…[TimeK]。作为[时间] 摘自[表3] 在[RegionList].[Region]=[DRegion].[Region]上加入[RegionList] 在[table3].[TimeK]=[DTime].[TimeK]上加入[DTime] 在[table3].[Key2]=[PKey].[Key2]上加入[PKey] 分组依据[RegionList]。[Cluster] ,[RegionList]。[Region] ,[客户] ,[Key1] ,[Key2] 正如[表1], 选择[表3]。[名称] ,[D产品][产品] ,[PKey]。[Key2] 案例 当[table1].[time]为空时,则[DProduct].[Product] 什么时候 否则无效 结束为[不活动] 摘自[表1] 在[table1].[Key1]=[DProduct].[Key1]上加入[DProduct] 在[table3].[Key2]=[PKey].[Key2]上加入[PKey] 在[table3].[Name]=[DName].[Name]上加入[Name] 同上[表2] 其中[NotActive]不为空
但是现在在语句的第二部分中有一个多部分标识符[table1]无法绑定的错误。我知道在这一部分它看不到[表1],但我该怎么办?有简单的解决办法吗?还是我走错了?

向我们展示一些示例表数据和预期结果-全部为格式化文本、mnot图像。在开始之前先看一下。为什么要重写查询?假设查询是等价的,它们的行为不会有任何不同。CTE本质上用作子查询—CTE语句在查询中得到扩展。这意味着第二个查询与第一个查询不同-FROM[table1]应该是FROM。。。。表1查询…第二个查询没有联接两个子查询。另一个问题是table2 CTE使用table1,但最终查询也使用table1。你为什么一开始就想移除CTE?这不会解决任何性能问题-是子查询中的GROUP BY导致了问题,这不是问题;有了声明,就只有有了;是一个语句终止符,它应该放在所有语句的末尾;它不是WITH和MERGE语句的起点,将WITH重写为子查询没有任何作用;这就是优化器已经在做的事情。CTEs之所以会出现问题,是因为引擎没有具体化中间结果——整个过程将被视为一个巨大的查询并进行优化。根据您的查询所做的操作,您可以通过将数据插入到临时表中来获得更好的结果。。。进桌。。。而不是CTE,因为优化器随后可以使用此数据的完整统计信息,而不是必须用于子查询的估计。