如何将两个CTE结合到单个select语句中
问题描述:
嗨,我试图将两个CTE表达式合并为单个,因为它们都具有几乎相同的连接表。我怎么能做到这一点?你的评论非常有价值。如何将两个CTE结合到单个select语句中
SELECT wf.WorkflowID
,COALESCE(STUFF((
SELECT distinct ''; '', '''' + cOPF.WorkflowLinkID
FROM Client_1_Workflow mopf`enter code here`
join Client_1_Workflow_Cell cOPF WITH(NOLOCK) on mopf.WorkflowID = cOPF.WorkflowLinkID
join Client_1_Workflow iwf WITH(NOLOCK) on cOPF.WorkflowID = wf.WorkflowID
where iwf.WorkflowID = wf.WorkflowID
FOR XML PATH(''''),TYPE).value(''(./text())[1]'',''VARCHAR(MAX)''),1,1,''''),'''') AS WorkflowID
from Client_1_Workflow wf WITH(NOLOCK)
SELECT wf.WorkflowID
,COALESCE(STUFF((
SELECT distinct ''; '', '''' +mopfn.WorkflowName
FROM Client_1_Workflow mopfn
join Client_1_Workflow_Cell cOPF WITH(NOLOCK) on mopfn.WorkflowID = cOPF.WorkflowLinkID
join Client_1_Workflow iwf WITH(NOLOCK) on cOPF.WorkflowID = wf.WorkflowID
where iwf.WorkflowID = wf.WorkflowID
FOR XML PATH(''''),TYPE).value(''(./text())[1]'',''VARCHAR(MAX)''),1,1,''''),'''') AS WorkflowName
from Client_1_Workflow wf WITH(NOLOCK)
答
SELECT wf.WorkflowID
,COALESCE(STUFF((
SELECT distinct ''; '', '''' + cOPF.WorkflowLinkID
FROM Client_1_Workflow mopf`enter code here`
join Client_1_Workflow_Cell cOPF WITH(NOLOCK) on mopf.WorkflowID = cOPF.WorkflowLinkID
join Client_1_Workflow iwf WITH(NOLOCK) on cOPF.WorkflowID = wf.WorkflowID
where iwf.WorkflowID = wf.WorkflowID
FOR XML PATH(''''),TYPE).value(''(./text())[1]'',''VARCHAR(MAX)''),1,1,''''),'''') AS WorkflowID
,COALESCE(STUFF((
SELECT distinct ''; '', '''' +mopfn.WorkflowName
FROM Client_1_Workflow mopfn
join Client_1_Workflow_Cell cOPF WITH(NOLOCK) on mopfn.WorkflowID = cOPF.WorkflowLinkID
join Client_1_Workflow iwf WITH(NOLOCK) on cOPF.WorkflowID = wf.WorkflowID
where iwf.WorkflowID = wf.WorkflowID
FOR XML PATH(''''),TYPE).value(''(./text())[1]'',''VARCHAR(MAX)''),1,1,''''),'''') AS WorkflowName
from Client_1_Workflow wf WITH(NOLOCK)
这是你的答案一个单一的查询。不知道什么是一对多,多对多等等,这是不可能的,以确定如何改变你的连接会影响你想要的结果
答
如果我正在阅读你的问题的意图权利,你想追加这些将表放在另一个的顶部,然后在两个CTE之间使用UNION ALL或UNION。如果这不是您问题的意图,请忽略。
CTE1
UNION ALL
CTE2;
这些不是CTE他们只是2选择语句。然后在列定义中使用子查询。你的选择中没有加入,但在你的子选项中有。无论如何,只需将动态列从第二个复制到顶端1,以使分隔字符串与现在相同,您仍然需要两个子查询,而无需试图加入任何东西。 – Matt
只需选择...,cOPF.WorkflowLinkID ,mopfn.WorkflowName ....而不是一个语句中的LinkID而另一个语句中的WorkflowName。展望未来,如果您简化了示例并澄清了这些陈述之间的差异可能会有所帮助,这可能会有所帮助。 – Missy
@missy他的COALESCE(STUFF)动态列是将查询内的所有行连接到单个(在本例中)分号分隔的字符串的机制,因此在子选择中更改任何内容都会改变分隔字符串的意图和值。所以选择...工作和名称不起作用 – Matt