I持ってOutputTemplates - > OutputBookmarks - > OutputNodes - > OutputTemplates - > OutputBookmarks - > OutputNodes ...等私は、既知のトップレベルのOutputNodesのセットで始めていますSQL再帰 - 親子 - 複数のレベル
OutputTemplate - > OutputBookmarks
すべての子OutputNodeIDを取得し、パフォーマンスを向上させるために、以下のクエリを簡略化したいと思います。
ALTER PROCEDURE [推進] AS [Promote_Outputs_Delete_Output_Nodes_Not_In_Source](promotionIDはUNIQUEIDENTIFIER @) は
WITH
CTE_OutputOptions
AS (
SELECT t.p.value('@OutputOptionID', 'uniqueidentifier') AS OutputOptionID,
t.p.value('@TemplateID', 'uniqueidentifier') AS OutputTemplateID
FROM [Promotion].Promotions AS p
CROSS APPLY p.OutputsXml.nodes('/Data/dbo.OutputOptions/dbo.OutputOptions') t(p)
INNER JOIN [dbo].[OutputOptions] oo
ON oo.OutputOptionID = t.p.value('@OutputOptionID', 'uniqueidentifier')
WHERE p.PromotionID = @promotionID)
,CTE_AllSourceOutputTemplates
AS (
SELECT t.p.value('@OutputTemplateID', 'uniqueidentifier') AS OutputTemplateID,
t.p.value('@TemplateFileName', 'nvarchar(200)') AS TemplateFileName,
t.p.value('@CreatedDate', 'datetime') AS CreatedDate,
coalesce(t.p.value('@CreatedByUserID', 'uniqueidentifier'), '00000000-0000-0000-0000-000000000000') AS CreatedByUserID,
t.p.value('@DeletedDate', 'datetime') AS DeletedDate,
t.p.value('@DeletedByUserID', 'uniqueidentifier') AS DeletedByUserID,
t.p.value('@ModifiedByUserID', 'uniqueidentifier') AS ModifiedByUserID,
t.p.value('@ModifiedDate', 'datetime') AS ModifiedDate,
t.p.value('@IOFileName', 'nvarchar(100)') AS IOFileName
FROM [Promotion].Promotions AS p
CROSS APPLY p.OutputsXml.nodes('/Data/Outputs.OutputTemplates/Outputs.OutputTemplates') t(p)
WHERE p.PromotionID = @promotionID)
,CTE_AllSourceBookmarks
AS (
SELECT t.p.value('@OutputDocTemplateBookmarkID', 'uniqueidentifier') AS OutputDocTemplateBookmarkID,
t.p.value('@OutputTemplateID', 'uniqueidentifier') AS OutputTemplateID,
t.p.value('@OutputDocBookmarkTypeID', 'int') AS OutputDocBookmarkTypeID,
t.p.value('@Name', 'nvarchar(200)') AS Name,
t.p.value('@DisplayOrder', 'int') AS DisplayOrder,
t.p.value('@DoPageBreakBefore', 'bit') AS DoPageBreakBefore,
t.p.value('@DoPageBreakAfter', 'bit') AS DoPageBreakAfter,
t.p.value('@SoftName', 'nvarchar(100)') AS SoftName,
t.p.value('@ShowOnOverridePage', 'bit') AS ShowOnOverridePage,
t.p.value('@AllowVisibilityOverride', 'bit') AS AllowVisibilityOverride,
t.p.value('@AllowForcePageBreak', 'bit') AS AllowForcePageBreak,
t.p.value('@ShowOnAllVersions', 'bit') AS ShowOnAllVersions,
t.p.value('@DefaultToHidden', 'bit') AS DefaultToHidden
FROM [Promotion].Promotions AS p
CROSS APPLY p.OutputsXml.nodes('/Data/Outputs.OutputDocTemplateBookmarks/Outputs.OutputDocTemplateBookmarks') t(p)
WHERE p.PromotionID = @promotionID)
,CTE_AllSourceOutputNodes
AS (
SELECT t.p.value('@OutputNodeID', 'uniqueidentifier') AS OutputNodeID,
t.p.value('@OutputNodeTypeID', 'int') AS OutputNodeTypeID,
t.p.value('@OutputTemplateID', 'uniqueidentifier') AS OutputTemplateID,
t.p.value('@OutputTemplateBookmarkID', 'uniqueidentifier') AS OutputDocTemplateBookmarkID,
t.p.value('@LinkedToNodeID', 'uniqueidentifier') AS LinkedToNodeID
FROM [Promotion].Promotions AS p
CROSS APPLY p.OutputsXml.nodes('/Data/Outputs.OutputNodes/Outputs.OutputNodes') t(p)
WHERE
p.PromotionID = @promotionID)
,CTE_TopSourceOutputTemplates
AS (
SELECT aot.OutputTemplateID,
TemplateFileName,
CreatedDate,
CreatedByUserID,
DeletedDate,
DeletedByUserID,
ModifiedByUserID,
ModifiedDate,
IOFileName
FROM CTE_AllSourceOutputTemplates aot
INNER JOIN CTE_OutputOptions opts
ON opts.OutputTemplateID = aot.OutputTemplateID
)
,CTE_TopSourceBookmarks
AS (
SELECT OutputDocTemplateBookmarkID,
ab.OutputTemplateID,
OutputDocBookmarkTypeID,
Name,
DisplayOrder,
DoPageBreakBefore,
DoPageBreakAfter,
SoftName,
ShowOnOverridePage,
AllowVisibilityOverride,
AllowForcePageBreak,
ShowOnAllVersions,
DefaultToHidden
FROM CTE_AllSourceBookmarks ab
INNER JOIN CTE_TopSourceOutputTemplates toptemplates
ON ab.OutputTemplateID = toptemplates.OutputTemplateID
)
,CTE_TopSourceOutputNodes
AS (
SELECT allsourcenodes.OutputNodeID,
allsourcenodes.OutputNodeTypeID,
allsourcenodes.OutputTemplateID,
allsourcenodes.OutputDocTemplateBookmarkID,
allsourcenodes.LinkedToNodeID
FROM CTE_AllSourceOutputNodes allsourcenodes
INNER JOIN CTE_TopSourceBookmarks topbookmarks
ON allsourcenodes.OutputDocTemplateBookmarkID = topbookmarks.OutputDocTemplateBookmarkID
)
,CTE_NextOutputTemplates1
AS (
SELECT aot.OutputTemplateID,
TemplateFileName,
CreatedDate,
CreatedByUserID,
DeletedDate,
DeletedByUserID,
ModifiedByUserID,
ModifiedDate,
IOFileName
FROM CTE_AllSourceOutputTemplates aot
INNER JOIN CTE_TopSourceOutputNodes topnodes
ON topnodes.OutputTemplateID = aot.OutputTemplateID
),
CTE_NextOutputBookmarks1
AS (
SELECT OutputDocTemplateBookmarkID,
ab.OutputTemplateID,
OutputDocBookmarkTypeID,
Name,
DisplayOrder,
DoPageBreakBefore,
DoPageBreakAfter,
SoftName,
ShowOnOverridePage,
AllowVisibilityOverride,
AllowForcePageBreak,
ShowOnAllVersions,
DefaultToHidden
FROM CTE_AllSourceBookmarks ab
INNER JOIN CTE_NextOutputTemplates1 nexttemplates
ON ab.OutputTemplateID = nexttemplates.OutputTemplateID
),
CTE_NextOutputNodes1
AS (
SELECT allsourcenodes.OutputNodeID,
allsourcenodes.OutputNodeTypeID,
allsourcenodes.OutputTemplateID,
allsourcenodes.OutputDocTemplateBookmarkID,
allsourcenodes.LinkedToNodeID
FROM CTE_AllSourceOutputNodes allsourcenodes
INNER JOIN CTE_NextOutputBookmarks1 nextbookmarks
ON allsourcenodes.OutputDocTemplateBookmarkID = nextbookmarks.OutputDocTemplateBookmarkID
)
--------
,CTE_NextOutputTemplates2
AS (
SELECT aot.OutputTemplateID,
TemplateFileName,
CreatedDate,
CreatedByUserID,
DeletedDate,
DeletedByUserID,
ModifiedByUserID,
ModifiedDate,
IOFileName
FROM CTE_AllSourceOutputTemplates aot
INNER JOIN CTE_NextOutputNodes1 nextnodes
ON nextnodes.OutputTemplateID = aot.OutputTemplateID
),
CTE_NextOutputBookmarks2
AS (
SELECT OutputDocTemplateBookmarkID,
ab.OutputTemplateID,
OutputDocBookmarkTypeID,
Name,
DisplayOrder,
DoPageBreakBefore,
DoPageBreakAfter,
SoftName,
ShowOnOverridePage,
AllowVisibilityOverride,
AllowForcePageBreak,
ShowOnAllVersions,
DefaultToHidden
FROM CTE_AllSourceBookmarks ab
INNER JOIN CTE_NextOutputTemplates2 nexttemplates
ON ab.OutputTemplateID = nexttemplates.OutputTemplateID
),
CTE_NextOutputNodes2
AS (
SELECT allsourcenodes.OutputNodeID,
allsourcenodes.OutputNodeTypeID,
allsourcenodes.OutputTemplateID,
allsourcenodes.OutputDocTemplateBookmarkID,
allsourcenodes.LinkedToNodeID
FROM CTE_AllSourceOutputNodes allsourcenodes
INNER JOIN CTE_NextOutputBookmarks2 nextbookmarks
ON allsourcenodes.OutputDocTemplateBookmarkID = nextbookmarks.OutputDocTemplateBookmarkID
)
----------------------
,CTE_NextOutputTemplates3
AS (
SELECT aot.OutputTemplateID,
TemplateFileName,
CreatedDate,
CreatedByUserID,
DeletedDate,
DeletedByUserID,
ModifiedByUserID,
ModifiedDate,
IOFileName
FROM CTE_AllSourceOutputTemplates aot
INNER JOIN CTE_NextOutputNodes2 nextnodes
ON nextnodes.OutputTemplateID = aot.OutputTemplateID
),
CTE_NextOutputBookmarks3
AS (
SELECT OutputDocTemplateBookmarkID,
ab.OutputTemplateID,
OutputDocBookmarkTypeID,
Name,
DisplayOrder,
DoPageBreakBefore,
DoPageBreakAfter,
SoftName,
ShowOnOverridePage,
AllowVisibilityOverride,
AllowForcePageBreak,
ShowOnAllVersions,
DefaultToHidden
FROM CTE_AllSourceBookmarks ab
INNER JOIN CTE_NextOutputTemplates3 nexttemplates
ON ab.OutputTemplateID = nexttemplates.OutputTemplateID
),
CTE_NextOutputNodes3
AS (
SELECT allsourcenodes.OutputNodeID,
allsourcenodes.OutputNodeTypeID,
allsourcenodes.OutputTemplateID,
allsourcenodes.OutputDocTemplateBookmarkID,
allsourcenodes.LinkedToNodeID
FROM CTE_AllSourceOutputNodes allsourcenodes
INNER JOIN CTE_NextOutputBookmarks3 nextbookmarks
ON allsourcenodes.OutputDocTemplateBookmarkID = nextbookmarks.OutputDocTemplateBookmarkID
)
-------------------------------------
,CTE_NextOutputTemplates4
AS (
SELECT aot.OutputTemplateID,
TemplateFileName,
CreatedDate,
CreatedByUserID,
DeletedDate,
DeletedByUserID,
ModifiedByUserID,
ModifiedDate,
IOFileName
FROM CTE_AllSourceOutputTemplates aot
INNER JOIN CTE_NextOutputNodes3 nextnodes
ON nextnodes.OutputTemplateID = aot.OutputTemplateID
),
CTE_NextOutputBookmarks4
AS (
SELECT OutputDocTemplateBookmarkID,
ab.OutputTemplateID,
OutputDocBookmarkTypeID,
Name,
DisplayOrder,
DoPageBreakBefore,
DoPageBreakAfter,
SoftName,
ShowOnOverridePage,
AllowVisibilityOverride,
AllowForcePageBreak,
ShowOnAllVersions,
DefaultToHidden
FROM CTE_AllSourceBookmarks ab
INNER JOIN CTE_NextOutputTemplates4 nexttemplates
ON ab.OutputTemplateID = nexttemplates.OutputTemplateID
),
CTE_NextOutputNodes4
AS (
SELECT allsourcenodes.OutputNodeID,
allsourcenodes.OutputNodeTypeID,
allsourcenodes.OutputTemplateID,
allsourcenodes.OutputDocTemplateBookmarkID,
allsourcenodes.LinkedToNodeID
FROM CTE_AllSourceOutputNodes allsourcenodes
INNER JOIN CTE_NextOutputBookmarks4 nextbookmarks
ON allsourcenodes.OutputDocTemplateBookmarkID = nextbookmarks.OutputDocTemplateBookmarkID
)
------------------------------
,CTE_NextOutputTemplates5
AS (
SELECT aot.OutputTemplateID,
TemplateFileName,
CreatedDate,
CreatedByUserID,
DeletedDate,
DeletedByUserID,
ModifiedByUserID,
ModifiedDate,
IOFileName
FROM CTE_AllSourceOutputTemplates aot
INNER JOIN CTE_NextOutputNodes4 nextnodes
ON nextnodes.OutputTemplateID = aot.OutputTemplateID
),
CTE_NextOutputBookmarks5
AS (
SELECT OutputDocTemplateBookmarkID,
ab.OutputTemplateID,
OutputDocBookmarkTypeID,
Name,
DisplayOrder,
DoPageBreakBefore,
DoPageBreakAfter,
SoftName,
ShowOnOverridePage,
AllowVisibilityOverride,
AllowForcePageBreak,
ShowOnAllVersions,
DefaultToHidden
FROM CTE_AllSourceBookmarks ab
INNER JOIN CTE_NextOutputTemplates5 nexttemplates
ON ab.OutputTemplateID = nexttemplates.OutputTemplateID
),
CTE_NextOutputNodes5
AS (
SELECT allsourcenodes.OutputNodeID,
allsourcenodes.OutputNodeTypeID,
allsourcenodes.OutputTemplateID,
allsourcenodes.OutputDocTemplateBookmarkID,
allsourcenodes.LinkedToNodeID
FROM CTE_AllSourceOutputNodes allsourcenodes
INNER JOIN CTE_NextOutputBookmarks5 nextbookmarks
ON allsourcenodes.OutputDocTemplateBookmarkID = nextbookmarks.OutputDocTemplateBookmarkID
)
select * from CTE_NextOutputNodes5 --where outputtemplateid is not null
UNION
SELECT * from CTE_NextOutputNodes4
UNION
SELECT * from CTE_NextOutputNodes3
UNION
SELECT * from CTE_NextOutputNodes2
UNION
SELECT * from CTE_NextOutputNodes1
UNION
SELECT * from CTE_TopSourceOutputNodes
END --Ultimately
BEGIN - 。これは以下
WITH
CTE_RecursiveTemplateBookmarkNodes AS
(
select t.outputtemplateid, b.outputdoctemplatebookmarkid, n.outputnodeid, n.outputtemplateid as nodetemplateid
from outputs.outputtemplates t
inner join outputs.OutputDocTemplateBookmarks b
on t.outputtemplateid = b.outputtemplateid
inner join outputs.outputnodes n
on b.outputdoctemplatebookmarkid = n.outputtemplatebookmarkid
UNION ALL
select t.outputtemplateid, b.outputdoctemplatebookmarkid, n.outputnodeid, n.outputtemplateid as nodetemplateid
from CTE_RecursiveTemplateBookmarkNodes cte
inner join outputs.outputtemplates t
on t.outputtemplateid = cte.nodetemplateid
inner join outputs.outputdoctemplatebookmarks b
on b.OutputTemplateID = t.outputtemplateid
inner join outputs.outputnodes n
on b.outputdoctemplatebookmarkid = n.outputtemplatebookmarkid
)
select distinct * from CTE_RecursiveTemplateBookmarkNodes
特定のノードが特定のテンプレートの親であることをクエリのどのフィールドで定義していますか? – Alexey
OutputNodesにはOutputTemplateID – nerdperson