sql >> データベース >  >> RDS >> Sqlserver

NOT IN (サブクエリ) ゼロ行を生成

    b の場合 これはバグではありません。問題は、SQL Server が NOT IN になることです。 一連の <> 1 AND <> 2 AND <> 3 に など <> NULL がある場合 、この場合は false を意味する unknown を返します。さまざまなシナリオで、これは ALL の資格または不適格となる可能性があります 行。 LEFT JOIN ではなく 次のように言う必要があります:

    FROM dbo.OuterTable AS t
    WHERE NOT EXISTS (SELECT 1 FROM x WHERE b = t.a);
      

    ここに簡単なデモンストレーションがあります:

    DECLARE @x TABLE(i INT);
    INSERT @x VALUES(1),(2);
    
    DECLARE @y TABLE(j INT);
    INSERT @y VALUES(2),(NULL);
    
    SELECT i FROM @x WHERE i NOT IN -- produces zero results
      (SELECT j FROM @y);
    
    SELECT i FROM @x  AS x WHERE NOT EXISTS -- produces one result
      (SELECT 1 FROM @y WHERE j = x.i);
      

    詳細 (および NOT EXISTS の理由を証明する指標) については、 が最良の代替手段です):

    http://www.sqlperformance.com /2012/12/t-sql-queries/left-anti-semi-join

    また、Gail Shaw によるこのブログ投稿もお読みください:

    http://sqlinthewild. co.za/index.php/2010/02/18/not-exists-vs-not-in/



    1. Laravel(5.3)Eloquent-関係の問題

    2. AccessでUNPIVOTをシミュレートする方法は?

    3. Oracleデータベースのアラビア文字

    4. タイムゾーン関数のヘルプ