2016-08-16 3 views
-3

こんにちは、私は2つのCTE式を1つに結合しようとしています。どのように私はこれを達成することができますか?あなたのコメントはとても貴重です。2つのCTEを1つの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つの選択文です。列定義で副選択を使用しています。あなたの選択にはジョインはありませんが、あなたのサブセレクトにあります。とにかく、2番目の列から1番目の列に動的列をコピーするだけで、区切り文字列を同じものにすることができます。何も結合しようとしていない両方の副選択が必要です。 – Matt

+0

...、cOPF.WorkflowLinkID 、mopfn.WorkflowName ....は、あるステートメントのLinkIDと、別のステートメントのWorkflowNameではなく、今後は、例を簡略化し、ステートメント間の相違点を明確にしておくと役立つかもしれません。 – Missy

+1

@missy彼のCOALESCE(STUFF)動的列は、クエリ内のすべての行を1つの(この場合は)セミコロンで区切られた文字列に連結するためのメカニズムで、サブ選択内の何かを変更すると、区切られた文字列のインテントと値が変更されます。だからSelect ...仕事と名前は動作しません – Matt

答えて

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

これは2 ctesを結合する方法であり、正しいですが、問題はcteに参加する方法ではなく、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) 

これはあなたの答えを持つ単一のクエリです。 1対多、多対多など何も知らないと、連結の変更が望む結果にどのように影響するかを判断することは不可能です

0

私はあなたの質問の意図をよく読んでいれば、 2つのCTEの間にUNION ALLまたはUNIONを使用します。これがあなたの質問の意図でない場合は、無視してください。

CTE1 
UNION ALL 
CTE2; 
関連する問題