Ответ Марк Байерс не работает, и это связано с очень тонким способом, которым SQL Server обрабатывает нули. В выражении 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
Второй оператор выбора не возвращает никаких строк, поэтому он не эквивалентен базовому оператору и поэтому не работает. Третье утверждение - это еще один способ написания этого запроса, который, один, работает, а два, по-прежнему обеспечивает возможность использования индекса для поля.
Итак, вот правильный ответ на вопрос:
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'