2016-08-16 102 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;