2017-04-14 14 views
0

私はWith Asステートメントを2つのテーブルで使用し、それぞれから2つの列を返します。各クエリは、それ自体で正常に動作します。データがWhere句を満たす両方のテーブルにある場合、正常に動作します。しかし、1つのテーブルがwhere句に合致するものがなく、もう1つのテーブルが空のリターンを取得した場合。それは内部のwhere節が他のテーブルに影響を与えないようですが、私が間違っていることはわかりません。私は何が必要だと思うSQL Server 2012テーブルがある場合、1つのテーブルが空の場合は何も返しません。

;WITH Issue AS 
(
    SELECT 
     I.[Title] as [Issue], 
     dbo.udf_StripHTML([Discussion]) as Discussion 
    FROM 
     [PSMADO].[dbo].[MSP_EpmProject_UserView] AS P 
    JOIN 
     [psmado].[dbo].[MSP_WssIssue_OlapView] AS I ON I.[projectUID] = P.[projectUID] 
    WHERE 
     I.[status] LIKE '%Active%' 
     AND I.[Category] LIKE '%Factors%' 
     AND p.[Workstream] LIKE 'PSO' 
), Risk AS 
(
    SELECT 
     I.[Title] as [Risk], 
     dbo.udf_StripHTML([MitigationPlan]) AS Mitigation 
    FROM 
     [PSMADO].[dbo].[MSP_EpmProject_UserView] AS P 
    JOIN 
     [psmado].[dbo].[MSP_WssRisk_OlapView] AS I ON I.[projectUID] = P.[projectUID] 
    WHERE 
     I.[status] LIKE '%Active%' 
     AND I.[Category] LIKE '%Factors%' 
     AND p.[Workstream] LIKE 'PSO' 
) 
SELECT * 
FROM Issue, Risk 
+1

厥が必要です。あなたは 'Outer Join'を必要とし、サンプルデータと予想される結果を追加します。また、結果を最後にクロス結合させるのはなぜですか? –

+0

[古いスタイルのJOINを使用した習慣が悪い](http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08/bad-habits-to-kick-using-old-style-joins。 aspx) - ANSI - ** 92 ** SQL標準(** 25年**前)のold * style *カンマ区切りのテーブル*スタイルのリストが*適切な* ANSI 'JOIN'構文に置き換えられました。使用はお勧めしません –

答えて

0

LEFT JOINで、riskissue条件のすべてがjoin clauseに置かれます。

SELECT 
    P.projectUID, 
    risk.[Title] as [Risk], 
    dbo.udf_StripHTML(risk.[MitigationPlan]) AS Mitigation, 
    I.[Title] as [Issue], 
    dbo.udf_StripHTML(I.[Discussion]) as Discussion 
FROM 
    [PSMADO].[dbo].[MSP_EpmProject_UserView] P 
LEFT JOIN [psmado].[dbo].[MSP_WssRisk_OlapView] risk 
    ON (risk.[projectUID] = P.[projectUID] AND risk.[status] LIKE '%Active%' 
     AND risk.[Category] LIKE '%Factors%') 
LEFT JOIN 
    [psmado].[dbo].[MSP_WssIssue_OlapView] I 
    ON (I.[projectUID] = P.[projectUID] AND I.[status] LIKE '%Active%' 
     AND I.[Category] LIKE '%Factors%') 
WHERE 
    p.[Workstream] LIKE 'PSO' 

私はp.[Workstream] LIKE 'PSO'p.[Workstream] = 'PSO'に等しいことに注意してください。

おそらくあなたは、INNER JOIN`がどのように機能するか `p.[Workstream] LIKE '%PSO%'

+0

すごくおもしろいです!ありがとうございました! – Bob

関連する問題