排除JOIN字段上的匹配项为NULL

Way*_*ton 6 sql t-sql sql-server

如果您执行的连接看起来像这样

SELECT T1.KeyField1, T1.KeyField2, T2.Field3
FROM T1 JOIN T2 ON T1.KeyField1 = T2.KeyField1 AND T1.KeyField2 = T2.KeyField2
Run Code Online (Sandbox Code Playgroud)

有没有办法不允许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
Run Code Online (Sandbox Code Playgroud)

编辑

我实际上问了这个问题......让我再试一次.

我们正在将新数据与旧数据进行比较,并查找行完全相同的记录.

所以两个表都定义了:

CREATE TABLE [Table](
    [Identifier] [int] IDENTITY(1,1) NOT NULL,
    [Key1] [varchar](50) NOT NULL,
    [Data1] [varchar](50) NULL,
    [Data2] [varchar](50) NULL
Run Code Online (Sandbox Code Playgroud)

如果我查询:

DELETE
FROM T1 JOIN T2 ON T1.Key1 = T2.Key1 
               AND T1.Data1 = T2.Data2 AND T1.Data2 = T2.Data2
Run Code Online (Sandbox Code Playgroud)

T1 & T2

| Key1 | Data1       | Data2   |
| 1000 | 123 Main St | <NULL>  |
| 1001 | 456 High St | FLOOR 2 |
Run Code Online (Sandbox Code Playgroud)

由于Data2为NULL,因此不会从T1中删除重复记录1000.

除了在连接中使用魔术值之外,还有其他方法可以比较这些吗?

我知道我应该让顾问重写代码以将所有NULLS插入'',但这是一项艰巨的任务.我也在寻找散列来寻找差异.

KM.*_*KM. 3

尝试使用这个:

SET ANSI_NULLS ON
Run Code Online (Sandbox Code Playgroud)

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

编辑

连接“神奇数字”,例如:

ISNULL(T1.Field1, '-9999') = ISNULL(T2.Field2, '-9999') 
Run Code Online (Sandbox Code Playgroud)

是您在您的情况下可以做的最好的事情,并且很可能会严重损害查询性能。我想说真正的问题是设计问题,加入 NULL 对我来说很奇怪。