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

时间:2010-10-19 19:54:16

标签: sql sql-server tsql

<击> 如果您执行的连接看起来像

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

提供

T1 & T2

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

这不会从T1中删除重复记录1000,因为Data2为NULL。

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

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

3 个答案:

答案 0 :(得分:4)

您是否考虑过有点费力的

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)
               )

答案 1 :(得分:3)

尝试使用:

SET ANSI_NULLS ON

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

修改

加入“魔术数字”,如:

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

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

答案 2 :(得分:0)

康拉德和KM的答案可以完成你的任务,但没有一个是非常干净的。主要原因是引入NULL的SQL允许支持三个值逻辑,其中NULL不等于NULL(运算符=)。

您的情况是NULL存在争议的原因之一,您可以阅读一些有关NULL的有趣理由,从wikipedia开始