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如果不够清楚,很抱歉。我找到了一个解决方案并发布了它。