Mark Byers の答えは機能しません。これは、SQL Server が null を処理する非常に微妙な方法によるものです。WHERE 式 " t1.DeleteFlag = 'Y' " で、t1.DeleteFlag が NULL の場合、式は NULL を返します。したがって、NOT (NULL) を実行しても NULL が返され、これは WHERE 条件に失敗します。このテストを実行してみてください:
DECLARE @myvar VARCHAR(1)
SET @myvar = NULL
SELECT 'OK' WHERE ISNULL(@myvar, 'N') = 'N' -- Baseline statement. Returns OK
SELECT 'OK' WHERE NOT (@myvar = 'Y') -- Equivalent to answer above. Fails
SELECT 'OK' WHERE @myvar = 'N' OR @myvar IS NULL -- This is another way to do it. Also returns OK
2 番目の select ステートメントは行を返さないため、baseline ステートメントと同等ではなく、機能しません。3 番目のステートメントは、このクエリを作成する別の方法です。1 つは機能し、2 つはフィールドのインデックスを使用できることを保証します。
したがって、これが質問に対する正しい答えです。
SELECT t1.v3, t2.v2
FROM t1
INNER JOIN t2
ON t1.v1 = t2.v1
WHERE (t1.DeleteFlag = 'N' OR t1.DeleteFlag IS NULL)
おそらく名目上はより良いパフォーマンス結果が得られるこれに代わる方法は、DeleteFlag フィールドを「NOT NULL」として定義し、DEFAULT として '' (空の文字列) を指定することです。次に、クエリは NULL を気にせずに簡単に記述できます。
SELECT t1.v3, t2.v2
FROM t1
INNER JOIN t2
ON t1.v1 = t2.v1
WHERE t1.DeleteFlag = 'N'