<击> 如果您执行的连接看起来像
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插入'',但这是一项艰巨的任务。我也在寻找散列来寻找差异。
答案 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开始