2017-09-27 18 views
-2

T-SQLでクエリを実行して、nullの列に基づいてデータセットを取り戻そうとしています。IS NULLは無視されます

これは、コードの簡易版である:

SELECT 
    T1.Col1, T1.Col2, 
    T1.Col3, T1.Col4 
FROM 
    table1 AS T1 
INNER JOIN 
    table2 AS T2 ON T1.Col2 = T2.Col3 
WHERE 
    T2.Col4 IS NULL 

問題があり、その結果、それは句が存在しないWHEREようなものだ、T2.Col4はNULLともNULLでない行が含まれています。あなたはINNER JOINを使用しているので

SELECT 

    M.ref      
    ,C.cname        
    ,CL.clname       
    ,C.ccity        
    ,M.productLine      
    ,M.code       
    ,CL.date 
    ,M.dept 
    ,DPT.group 
    ,TK2.tkname 
    ,TK2.tkdept 


FROM DB.dbo.manage AS M 

     OUTER JOIN DB.dbo.ClientManageRelationship AS CMR 
     ON CMR.RelatedEntityID = M.EntityID 

     OUTER JOIN DB.dbo.Client AS C 
     ON C.EntityID = CMR.EntityID 

     INNER JOIN DB.dbo.ManageCustomerRelationship AS MCR 
     ON MCR.EntityID = M.EntityID 

     INNER JOIN DB.dbo.Customer AS CL 
     ON CL.EntityID = MCR.RelatedID 

     INNER JOIN DB.dbo.timek AS TK 
     ON TK.tki = M.tkid 

     LEFT JOIN (SELECT Group = division, [Department] = newdesc, deptcode FROM DB.csrt.vw_rep_p_l_dept) AS DPT 
     ON tkdept = DPT.dept 

     LEFT JOIN (SELECT Name = TK2.tkfirst + ' ' + TK2.tklast, TK2.tki, TK2.dept, TK2.loc FROM DB.dbo.timek as TK2 WITH(NOLOCK)) AS TK2 
     ON TK2.tki = M.tkid 


    WHERE DPT.Department = 'Casualty' 
    AND UPPER (C.ClientName) LIKE '%LIMITED%' 
    AND CL.date > '31/12/2014' 
    AND CL.Date IS NULL 
    AND TK.tkloc = 'loc1' OR TK.tkloc = 'loc2' 

ORDER BY M.ref 
+1

よろしいですか? T2.Col4を選択してサンプルデータと出力に追加できます(テキスト表形式)。 – etsa

+1

whereを指定せずにクエリを実行すると、NULLSが返されますか? –

+0

申し訳ありませんが、もっと明確にすべきでした。 T2Col4も選択されているので、その結果を見ることができます。私はwhere句を取り出しました。私はNULLSを返していますが、NULLSは戻っていませんが、WHERE句のない大きな結果セットを取得しています。また、私のサンプルコードよりも多くのジョインがありますが、違いがあるかどうかは分かりません。 – mark

答えて

0

私の最初の答えは次のようになります。コードの完全版 -

任意のアイデアを大幅に

UPDATEだろう。これは、2つのテーブル間の一致のみを返します。 TRY FULL OUTER JOINは、一致するかどうかに関係なくすべての値を返し、NULLを含みます。

テーブルのうちの1つのみのNULLSを含む一致の有無にかかわらずすべての行を返す場合は、右または左ジョインを使用します。

私は2つのテーブル( 'Person'と 'Figure')がありました。すべての人がいつでも数字を入力しているわけではありません。しかし、ある例では、ある日に数字を入力したかどうかに関係なく、すべての人を返すことができるかもしれません。

私はすべての人々(左表)は関係なく、そこの姿テーブル内の任意のマッチ(右表)であることの戻りたいので、これに対する私の最初のアプローチは、参加LEFTだろう

FROM Person P 
    LEFT JOIN Figure F 
    ON P.ID = F.ID 

これはです内側がヌル

を含むだけでなく、一致する値を生成するジョインなど

一方
 Name  Figure 

     Sam  20 
     Ben  30 
     Matt  NULL 
     Simon  NULL 

結果を生成

 Name  Figure 

     Sam  20 
     Ben  30 

左結合は、右結合と同じように動作しますが、逆方向です。これはおそらくあなたが直面していた問題です。しかし、私はこれが助けてくれることを願っています

+0

ありがとうライアン。これで正しい結果が得られますが、INNER JOINの問題は理解できません。 INNER JOINは結合列に一致する部分とNULLを含む部分のみを結果として表示してはいけませんか? – mark

+0

あなたのテーブル構造を見ることなく正確に言うのは難しいですが、私は助けてくれる答えに例を追加しようと思います。 –

+0

小さな部分ではなく完全なコードを追加します。 – mark

0

問題は最後の部分にあると思います。 角かっこを使用する必要があります。

`WHERE DPT.Department = 'Casualty' 
    AND UPPER (C.ClientName) LIKE '%LIMITED%' 
    AND CL.date > '31/12/2014' 
    AND CL.Date IS NULL 
    AND (TK.tkloc = 'loc1' OR TK.tkloc = 'loc2')` 

または

`WHERE DPT.Department = 'Casualty' 
    AND UPPER (C.ClientName) LIKE '%LIMITED%' 
    AND CL.date > '31/12/2014' 
    AND CL.Date IS NULL 
    AND TK.tkloc IN ('loc1', 'loc2')` 
関連する問題