将临时表与实际表进行比较

时间:2015-07-04 16:06:24

标签: sql sql-server tsql

我们说我的剧本中有两张桌子。

@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语句适用于两个表变量,而不是当我尝试选择实际表时呢?

1 个答案:

答案 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