2017-09-25 21 views
1

最近更新されたアドレスで次のコードを使用すると、ZIP内のすべての関連フィールドがNULLとして返されます。私は外部からの適用を試みましたが、より良い仕事をしますが、存在していても、右側の2つのテーブルからすべての単一のジップを検索するわけではありません。左外部結合でNULLを選択した場合

SELECT 
    i.ion_ID as [ION], 
    zip.City as [City], 
    zip.StateCode as [State], 
    zip.ZipCode as [Zip Code], 
    zip.County as [County] 
FROM  
    HWSP_t_ION i 
     LEFT OUTER JOIN (SELECT TOP 1 ad.AssociatedIDValue, z.Zipcode, z.City, z.StateCode, z.County 
            FROM CADD_t_Address ad 
             LEFT OUTER JOIN CADD_lt_ZipCode z 
              ON ad.zip = z.ZipCode 
            ORDER BY ad.ChangedOn desc 
             ) AS ZIP 
     ON zip.AssociatedIDValue = i.ION_ID 

EDIT:SQLを操作する場合は、セット内のデータを考える

SELECT 
    i.ion_ID as [ION], 
    zip.City as [City], 
    zip.StateCode as [State], 
    zip.ZipCode as [Zip Code], 
    zip.County as [County] 
OUTER APPLY       (SELECT TOP 1 ad.zip 
            FROM CADD_t_Address ad 
            WHERE ad.AssociatedIDValue = ci.ION_ID 
            and [ad].[Status] = 'ACTIVE' 
            ORDER BY ad.ChangedOn desc 
             ) ad 


OUTER APPLY       (SELECT TOP 1 zip.Zipcode, zip.City, zip.StateCode, zip.County as [County] 
            FROM CADD_lt_ZipCode zip 
            WHERE ad.zip = zip.ZipCode 
            ) zip 
+1

サンプルデータと希望の結果を提供する場合は、回答するほうが簡単でしょう – Veljko89

+0

これはPIIの機密データです。 IONはケース番号であり、300k +の行をすべて引き出しています。残りのフィールド(zip.xxx)はすべてnullとして戻されます。だから何かが正しく結合していない。 –

+0

これを分解して解除してください。簡単な言葉にすることができれば、必要な場所を把握するのに役立ちます。使用しているSQLのバージョン。あなたがしようとしていることの基本的な例を設定できるかどうかを調べるには、sqlfiddleのようなものを試してみてください。 – Shawn

答えて

1

: これはどのように見えるか外側が適用されます。セットをどのように組み合わせたいか考えてみてください。この場合、アウターセットのデータを取得するには、1行のインナーセットが必要です。ウィンドウ関数は内側のセットに対して非常にうまく機能します。ソートの最初の行を指定する行番号(rn)を生成してから、rn = 1以外のものを削除します。一度最新のレコードを取得したら、2つのセットをリンクするだけです。

のようなものを試してみてください:

SELECT 
    t1.ID 
    , s2.blah 
    , s2.moreBlah 
FROM t1 
LEFT OUTER JOIN (
    SELECT * 
    FROM (
     SELECT t2.id, t2.blah, t3.moreBlah 
      , ROW_NUMBER() OVER (PARTITION BY <columnToBaseOrderFrom> ORDER BY changeDate DESC) AS rn 
     FROM t2 
     LEFT OUTER JOIN t3 ON t2.refID = t3.id 
    ) s1 
    WHERE rn = 1 
) s2 ON t1.id2 = s2.id 

あなたがNULLのレコードを排除する必要がある場合は、あなたが排除されるT1から行をしたい場合、彼らはより一致していないかどうかを判断する必要がありますs2サブクエリ。その場合、LEFT OUTER JOINではなくINNER JOINが必要です。

+0

これはうまくいきました!しかし、私はOUTER APPLYで見たものと同じヌルをまだ見ているので、根本的で無関係な問題があるはずです。私はそれに取り組んでいきます。ご協力いただきありがとうございます! –

+0

それから 'HWSP_t_ION'テーブルに一致しない' ZIP'サブセレクトの行があります。 'zip.AssociatedIDValue = i.ION_ID'でJOINする必要があることをダブルチェックします。また、それぞれのクエリを個別に実行して、何が返されているかを確認することもできます。最終的な注記:「INNER JOIN」または「LEFT OUTER JOIN」が必要ですか? – Shawn

+0

間違いなく外部結合を残し、以前の質問に答えるために、SQL Server 2016を使用しています。 –

関連する問題