2017-04-07 28 views
1

私は2つのテーブル(ジャーナルとインシデント)を持っています。各インシデントには、複数のジャーナルエントリがある場合があります。レコードと最新のジャーナルデータを選択します。最新のレコードを選択

下部のwhereセクションは、私が見たいインシデントをフィルタリングするものです。そのうちのジャーナル値は、最新のジャーナルエントリに関連付けられます。

これは私がここで見つけたコードのアマルガムですが、実行すると「データセット 'DataSet1」に対してクエリの実行に失敗しました。残念ながら、私はログファイルにアクセスできません手がかりがあります

は、すべてのヘルプは高く評価され、私はそれが間違っている入れ子になっていかもしれないと思う

SELECT 
b.IncidentNumber 
,a.Subject 
,a.CreatedDateTime 
,b.SubCategory 
,b.EffectiveDueDate 
,b.NextActionDate 
,b.ProfileFullName 

FROM 
(
SELECT 
    b.IncidentNumber 
,a.Subject 
,a.CreatedDateTime 
,rn = row_number() OVER (PARTITION by b.IncidentNumber ORDER BY 
    a.CreatedDateTime DESC) 
,b.SubCategory 
,b.EffectiveDate 
,b.NextActionDate 
,b.ProfileFullName 


FROM 
Journal a LEFT JOIN Incident b ON 
a.ParentRecordNumber = b.IncidentNumber 

WHERE a.Category LIKE '%KANBAN%' 
AND (b.Status LIKE' %Waiting%' OR b.status LIKE '%Active%') 
AND b.SubCategory <> 'User Termination' 
AND b.SubCategory <> 'Res Temp Termination' 
AND a.Subject LIKE 'UP |%' 
) X 
WHERE rn = 1 
+0

SSMSでクエリを実行し、どのようなエラーが発生するかを確認してください。 –

+1

トップセレクトはbまたはaのみを使用しません。 – xQbert

答えて

1

いくつかのこと:。。。

  • 最も外側の選択された値は、インライン・ビューからエイリアスされなければならないが、「 X "いいえ。 r b。これらのエイリアスは内側のクエリのスコープ内にのみ存在するためです。 (coorlationを使用する場合を除いて、それは私が信じるだけのレベルです)
  • 左の代わりにright joinを必要とするか、テーブルの順序を変更する必要があります。私はあなたがすべての出来事と最新のジャーナルを望んでいると信じています。すべてのジャーナルとそれが存在する場合は関連する事件ではありません。私は順序を変更しました。
  • 最後に、外部結合を使用する場合、外部結合のすべてのレコード表にのみ制限を設定できます。 Where句の条件では、OUTER結合表は、外部結合によって生成されたNULLレコードを除外します。これを解決するには、制限条件を結合に移すか、 'or'ステートメントを使用してnullをチェックする必要があります(結合に移動するのがよりクリーンです)。参加が発生する前に制限が適用されていると考えて、インシデントからのNULLレコードを保持します。そうでない場合、外部結合は両方のテーブルにないレコードを除外してINNER JOINをシミュレートします(この場合、インシデントではなくジャーナルにはありません)。

SELECT x.IncidentNumber --alias x not a/b as the from is aliased as 'X' 
    , x.Subject 
    , x.CreatedDateTime 
    , x.SubCategory 
    , x.EffectiveDueDate 
    , x.NextActionDate 
    , x.ProfileFullName 
FROM (SELECT b.IncidentNumber 
      , a.Subject 
      , a.CreatedDateTime 
      , rn = row_number() OVER (PARTITION by b.IncidentNumber 
            ORDER BY a.CreatedDateTime DESC) 
      , b.SubCategory 
      , b.EffectiveDate 
      , b.NextActionDate 
      , b.ProfileFullName 
     FROM Incident b --switched the order I think you want all incidents and if a journal exists it's value. 
     LEFT JOIN Journal a 
     ON a.ParentRecordNumber = b.IncidentNumber 
     -- Since A is on the if match found to B, we need to move this to the join or we lose the records created from the outer join. 
     AND a.Category LIKE '%KANBAN%' 
     AND a.Subject LIKE 'UP |%' 
     --moved some where clause criteria to the join Since B is on the "all records side" of the outer join we can leave B in the where clause. 
     WHERE (b.Status LIKE' %Waiting%' OR b.status LIKE '%Active%') 
      AND b.SubCategory <> 'User Termination' 
      AND b.SubCategory <> 'Res Temp Termination') X 
WHERE rn = 1 

あなたはここからレコードを取得していない場合、私は必要に応じて、クエリが機能していることを確認してから発見されるレコードが発生しないですか見て限界に戻って追加する制限基準の一部を削除し始めるだろう。

+0

優秀、私はこれを試してみて、それがどのようになっているかを知らせます。 –

0

最終的には、このレポートが期待どおりに機能しています。クエリーを動作させるには数回の反復が必要でしたが、今は必要なことをやっています。あなたの助けてくれてありがとう。私はそれがなくては決してそこに行かなかっただろう!

SELECT x.IncidentNumber 
, x.Subject 
, x.CreatedDateTime 
, x.SubCategory 
, x.ProfileFullName 
, x.PropertyNumber 
, x.Status 
, x.EffectiveDueDate 

FROM (SELECT b.IncidentNumber 
     , a.Subject 
     , a.CreatedDateTime 
     , rn = row_number() OVER (PARTITION by b.IncidentNumber 
           ORDER BY a.CreatedDateTime DESC) 
     , b.SubCategory 
     , b.ProfileFullName 
     , b.PropertyNumber 
    , b.Status 
     , b.EffectiveDueDate 

    FROM Incident b 
    RIGHT JOIN Journal a 
     ON a.ParentRecordNumber = b.IncidentNumber 

     AND a.Category LIKE '%KANBAN%' 
     AND a.Subject LIKE 'UP |%'  
     WHERE (b.Status LIKE' %Waiting%' OR b.status LIKE '%Active%') 
    ) x 

WHERE rn = 1 
関連する問題