Исключая совпадения в полях JOIN, которые имеют значение NULL - PullRequest
6 голосов
/ 19 октября 2010

Если вы выполняете объединение, которое выглядит следующим образом

SELECT T1.KeyField1, T1.KeyField2, T2.Field3
FROM T1 JOIN T2 ON T1.KeyField1 = T2.KeyField1 AND T1.KeyField2 = T2.KeyField2

Есть ли способ не позволить NULLS совпадать с результатами, полученными в результате этого запроса

SELECT T1.KeyField1, T1.KeyField2, T2.Field3
FROM T1 JOIN T2 ON T1.KeyField1 = T2.KeyField1 AND T1.KeyField2 = T2.KeyField2
               AND T1.KeyField2 IS NOT NULL AND T2.KeyField2 IS NOT NULL

РЕДАКТИРОВАТЬ

Я фактически задал вопрос неправильно .... Позвольте мне повторить попытку.

Мы сравниваем новые данныек старым данным и поиск записей, где строки в точности совпадают.

Итак, обе таблицы определены:

CREATE TABLE [Table](
    [Identifier] [int] IDENTITY(1,1) NOT NULL,
    [Key1] [varchar](50) NOT NULL,
    [Data1] [varchar](50) NULL,
    [Data2] [varchar](50) NULL

Если я сделаю запрос:

DELETE
FROM T1 JOIN T2 ON T1.Key1 = T2.Key1 
               AND T1.Data1 = T2.Data2 AND T1.Data2 = T2.Data2

Give

T1 & T2

| Key1 | Data1       | Data2   |
| 1000 | 123 Main St | <NULL>  |
| 1001 | 456 High St | FLOOR 2 |

Это не приведет к удалению дубликата записи 1000 из T1, поскольку Data2 равен NULL.

Помимо использования магического значения в объединении, есть ли другой способ сравненияэто?

Я понимаю, что я должен заставить консультантов переписать код, чтобы вставить все NULLS как '', но на этом этапе это огромная задача.Я также смотрю на хеширование строки, чтобы найти различия.

Ответы [ 3 ]

4 голосов
/ 20 октября 2010

Считаете ли вы несколько трудоемким

DELETE
FROM T1 JOIN T2 ON T1.Key1 = T2.Key1 
               AND 
               (T1.Data1 = T2.Data1
                OR 
                   (T1.Data1 is Null AND T2.data1 is Null)
               )
               AND
               (T1.Data2 = T2.Data2
                OR 
                   (T1.Data2 is Null AND T2.Data2 is Null)
               )
3 голосов
/ 20 октября 2010

попробуйте использовать это:

SET ANSI_NULLS ON

http://msdn.microsoft.com/en-us/library/aa259229(SQL.80).aspx

РЕДАКТИРОВАТЬ

, соединяясь с "магическими числами" как:

ISNULL(T1.Field1, '-9999') = ISNULL(T2.Field2, '-9999') 

- лучшее, что вы можете сделать в вашей ситуации, и, скорее всего, это значительно снизит производительность запроса.Я бы сказал, что настоящая проблема заключается в дизайне, присоединение к NULL просто странно для меня.

0 голосов
/ 20 октября 2010

Ответы Конрада и К.М. достигают вашей цели, но ни один не очень чистый.Основная причина в том, что в SQL с введением NULL допускается поддержка логики с тремя значениями, где NULL не равен NULL (оператор =).

Ваш случай является одной из причин, по которой NULL противоречивы, и вы можете прочитатьнекоторые интересные обоснования для NULL, начинающиеся с wikipedia

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...