2016-08-16 187 views
-3

嗨,我试图将两个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) 
+1

这些不是CTE他们只是2选择语句。然后在列定义中使用子查询。你的选择中没有加入,但在你的子选项中有。无论如何,只需将动态列从第二个复制到顶端1,以使分隔字符串与现在相同,您仍然需要两个子查询,而无需试图加入任何东西。 – Matt

+0

只需选择...,cOPF.WorkflowLinkID ,mopfn.WorkflowName ....而不是一个语句中的LinkID而另一个语句中的WorkflowName。展望未来,如果您简化了示例并澄清了这些陈述之间的差异可能会有所帮助,这可能会有所帮助。 – Missy

+1

@missy他的COALESCE(STUFF)动态列是将查询内的所有行连接到单个(在本例中)分号分隔的字符串的机制,因此在子选择中更改任何内容都会改变分隔字符串的意图和值。所以选择...工作和名称不起作用 – Matt

回答

-1
; WITH CTE1 AS 
(
BLAH 
) 
, CTE2 AS 
(
BLAH BLAH 
) 
SELECT * FROM CTE1 JOIN CTE2 ON CTE1.BLAH = CTE2.BLAH 
+3

这是如何加入2个ctes和是正确的,但问题不是如何加入ctes,而是如何将2个查询简化为1 – Matt

+0

@Matt我认为他可以弄清楚如何做到这一点。如果他知道如何使用CTE的话。如果你觉得这不合适的答案。我将删除它。 (PS:我不想搞砸自己的声誉,我正在努力争取50分才有权发表评论。) – Hari

0
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) 

这是你的答案一个单一的查询。不知道什么是一对多,多对多等等,这是不可能的,以确定如何改变你的连接会影响你想要的结果

0

如果我正在阅读你的问题的意图权利,你想追加这些将表放在另一个的顶部,然后在两个CTE之间使用UNION ALL或UNION。如果这不是您问题的意图,请忽略。

CTE1 
UNION ALL 
CTE2;