我们说我的剧本中有两张桌子。
@varTable
tableA
第一个是变量表,第二个是数据库中的实际表。我完全从脚本创建临时表,它具有相同的列,类型和大小。
我的脚本可以填充 @varTable 。
我的目标是将当前不在 tableA 中的 @varTable 中的所有记录插入 tableA 。
这是我的SQL:
insert into [tableA]
SELECT * FROM @varTable WHERE [columnA] NOT IN (SELECT [columnA] FROM [tableA]);
select语句总是返回一个空白语句。
如果我单独查看表格,我绝对相信 tableA 没有数据, @varTable 就是这样。
这是让它变得更加混乱的部分。我测试了另一个名为 @ varTable2 的表变量,并在插入脚本中使用它而不是实际表名( tableA )进行了测试;它完美无缺。
那么为什么select语句适用于两个表变量,而不是当我尝试选择实际表时呢?
答案 0 :(得分:6)
如果columnA
永远NULL
,就会发生这种情况。一个简单的解决方法是:
SELECT *
FROM @varTable
WHERE [columnA] NOT IN (SELECT a.[columnA] FROM [tableA] a WHERE a.columnA IS NOT NULL);
但是,我建议使用NOT EXISTS
。它具有您想要的语义:
SELECT *
FROM @varTable vt
WHERE NOT EXISTS (SELECT 1
FROM tableA a
WHERE a.columnA = vt.columnA);
事实上,我认为当列表由常量表达式组成时,我只使用NOT IN
。