Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.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
Sql server SQL Server:为每个记录运行单独的CTE,而不使用游标或函数_Sql Server_Common Table Expression_Sql Function_Cross Apply - Fatal编程技术网

Sql server SQL Server:为每个记录运行单独的CTE,而不使用游标或函数

Sql server SQL Server:为每个记录运行单独的CTE,而不使用游标或函数,sql-server,common-table-expression,sql-function,cross-apply,Sql Server,Common Table Expression,Sql Function,Cross Apply,给定具有列LocationID和许多记录的表A 是否可以为每条记录完全运行CTE,而不使用游标(在获取循环时)或函数(通过交叉应用) 我无法从表a运行CTE,因为CTE将深入父-子层次表(ParentID,ChildID),为表a的每个LocationID查找特定类型的所有子代。似乎如果我使用表a执行CTE,它将混合表a中所有LocationID的子代 基本上,我需要为表a的每个LocationID分别运行一个CTE,并将其放入一个包含LocationID和ChildID列的表中(Locatio

给定具有列
LocationID
和许多记录的表A

是否可以为每条记录完全运行CTE,而不使用游标(在获取循环时)或函数(通过交叉应用)

我无法从表a运行CTE,因为CTE将深入父-子层次表(ParentID,ChildID),为表a的每个LocationID查找特定类型的所有子代。似乎如果我使用表a执行CTE,它将混合表a中所有LocationID的子代


基本上,我需要为表a的每个LocationID分别运行一个CTE,并将其放入一个包含LocationID和ChildID列的表中(LocationID是表a中的那些列,ChildID是通过CTE找到的特定类型的所有后代)。

这是您的基本布局

;with CTE AS
(
   select .......
)

select *
from CTE
cross apply (select distinct Location from TableA) a
where CTE.Location=a.Location

一些样本数据和预期结果将提供更好的答案。

您可以这样做:

Declare @LocationID As Int
Select
    LocationID
    , 0 as Processed
Into #Temp_Table
From TableA

While Exists (Select Top 1 1 From #Temp_Table Where Processed = 0)
Begin
    Select Top 1 @LocationID = LocationID
    From #Temp_Table 
    Where Processed = 0
    Order By LocationID

    /*  Do your processing here */

    Update #Temp_Table Set
        Processed = 0
    Where LocationID = @LocationID
End

它仍然是RBAR,但(至少在我的环境中)它比光标快得多。

我找到了解决方案。我只需要保留原始的
LocationID
作为参考,然后在CTE结果中,当它深入到列表中时,将包括所有可能的记录,我应用所需的过滤器。是的,结果中的所有记录都是混合的,但是因为保留了对原始表LocationID的引用(如
OriginalParentID
),所以我仍然能够检索到它

;WITH CTE AS
(
    --Original list of parents
    SELECT a.LocationID AS OriginalParentID, l.ParentID, l.ChildID, l.ChildType
    FROM TableA a
    INNER JOIN tblLocationHierarchy l ON l.ParentID = a.LocationID

    UNION ALL

    --Getting all descendants of the original list of parents
    SELECT CTE.OriginalParentID, l.ParentID, l.ChildID, l.ChildType
    FROM tblLocationHierarchy l
    INNER JOIN CTE ON CTE.ChildID = l.ParentID
)
SELECT OriginalParentID, ChildID
FROM CTE
--Filtering is done here
WHERE ChildType = ...

基于这种模糊的描述,我不知道你想问什么。CTE不是您“运行”的东西,它是一个派生表,所以我认为这可能是一个XY问题。@TabAlleman如果不够清楚,很抱歉。我找到了一个解决方案并发布了它。