4

元のクエリは16万行を返します。LEFT OUTER JOINを追加すると:

LEFT OUTER JOIN Table_Z Z WITH (NOLOCK) ON A.Id = Z.Id

クエリは150行のみを返します。何が間違っているのかわかりません。

クエリに列を追加するだけで、別のテーブルからコードが返されます。コードは数値またはNULLにすることができます。それでもNULLを表示する必要があるため、LEFT結合の理由です。それらは「id」列で結合する必要があります。

SELECT <lots of stuff> + the new column that I need (called "code").
FROM 
    dbo.Table_A A WITH (NOLOCK)
INNER JOIN 
    dbo.Table_B B WITH (NOLOCK) ON A.Id = B.Id AND A.version = B.version

--this is where I added the LEFT OUTER JOIN. with it, the query returns 150 rows, without it, 160k rows.    
LEFT OUTER JOIN 
    Table_Z Z WITH (NOLOCK) ON A.Id = Z.Id
LEFT OUTER JOIN 
    Table_E E WITH (NOLOCK) ON A.agent = E.agent
LEFT OUTER JOIN 
    Table_D D WITH (NOLOCK) ON E.location = D.location
                            AND E.type = 'Organization'
                            AND D.af_type = 'agent_location'
INNER JOIN 
    (SELECT X , MAX(Version) AS MaxVersion 
     FROM LocalTable WITH (NOLOCK) 
     GROUP BY agemt) P ON E.agent = P.location AND E.Version = P.MaxVersion

誰かが問題を引き起こしている可能性があるものを知っていますか?

4

2 に答える 2

2

LEFT OUTER JOINテーブルAとの間でを実行するとE、 からの元のデータ セットが保持されますA。つまりE、クエリの行数を減らす可能性のあるテーブルにデータがないか、データが不足しています。

ただし、次に と の間EでINNER JOIN を実行するとP、返される行数を減らす可能性が実際に開かれています。LEFT OUTER JOINこれにより、後続の が のように扱われますINNER JOIN

現在、正確なスキーマとテスト対象のデータ セットがなければ、これが実際に発生している問題である場合とそうでない場合があります。それでも、原則として、常にINNER JOINs を s の前に置きますOUTER JOIN。これにより、このようなクエリを非常に簡単に作成できます。最も制限の厳しい結合が最初に行われ、後で外部結合が壊れる心配はありません。

簡単な修正として、最後の結合を に変更してP、結合が機能するLEFT OUTER JOINかどうかを確認してくださいZ

于 2012-12-03T20:41:31.223 に答える