Это реальная проблема, потому что SQL Server не имеет NULL
-безопасного оператора сравнения. Стандартный оператор ANSI: IS NOT DISTINCT FROM
.
Проблема с OR
заключается в том, что она исключает использование индексов. Проблема с ISNULL()
такая же. Так что, если ваши таблицы имеют какой-либо размер, вы хотите их избежать.
Одна вещь, которую вы можете сделать, это установить значения по умолчанию. Я не знаю, какие значения по умолчанию позволяют избежать существующих значений, но это может выглядеть так:
update table1
set column1 = coalesce(column1, ''), -- for strings
column2 = coalesce(column2, -1), -- for numbers
column3 = coalesce(column3, cast('1900-01-01' as date)) -- for dates
where column1 is null or column2 is null or column3 is null;
Вам нужно будет сделать это на обоих столах. После этого вы можете восстановить значения NULL
после удаления.
На самом деле, в SQL Server вы можете добавить вычисляемые столбцы:
alter table1 add column1_notnull as (coalesce(column1, '')) persisted; -- or whatever
Затем вы можете создать индекс для них:
create index idx_table1_columns_123_notnull on table1(column1_notnull, column2_notnull, column3_notnull);
И повторите для table2
.
Тогда ваш первый запрос будет работать (конечно, используя столбцы _notnull
) и использовать индекс для производительности.