SQL插入到使用Union应该只添加不同的值

时间:2012-02-15 19:01:27

标签: sql sql-server tsql

所以我有这个临时表,其结构如下:

col1    col2    col3    col3
intID1  intID2  intID3  bitAdd

我正在使用select查询和存储来对这个临时表的值进行联合 它进入同一个临时表。事情是col3不是我将要的联合查询的一部分 稍后需要它来更新表格。

所以我这样做:

Insert into  #temptable
(
intID1,
intID2,
intID3
)
select intID1,intID2,intID3
From
#temptable

UNION

select intID1,intID2,intID3
From
Table A

问题是我只想添加临时表中尚不存在的行。这样做会添加已存在行的副本(因为union将返回一行)如何只插入我的联合查询中当前临时表中不存在的那些行?

3 个答案:

答案 0 :(得分:9)

使用MERGE

MERGE INTO #temptable tmp
USING (select intID1,intID2,intID3 From Table A) t
ON (tmp.intID1 = t.intID1 and tmp.intID2 = t.intID2 and tmp.intID3 = t.intID3)
WHEN NOT MATCHED THEN
INSERT (intID1,intID2,intID3)
VALUES (t.intID1,t.intID2,t.intID3)

答案 1 :(得分:7)

EXCEPT

很简单
INSERT INTO  #temptable (intID1, intID2, intID3)
SELECT intID1,intID2,intID3 FROM TableA
EXCEPT
SELECT intID1,intID2,intID3 FROM #temptable

答案 2 :(得分:0)

我知道你来自哪里。在大多数编程语言中,#temptable将是一个变量(简称为关系变量或relvar),因此您可以为其赋值(关系值):

#temptable := #temptable UNION A

在关系模型中,这将实现所需的结果,因为关系根据定义没有重复的行。

但是,SQL并不是真正的关系,也不支持赋值。相反,您需要使用SQL DML INSERT语句向表中添加行(这不是很糟糕:真正的关系数据库语言的用户,如果我们有一个,无疑会要求关系的类似简写赋值!)但你也需要自己进行重复测试。

Daniel Hilgarth和Joachim Isaksson的答案看起来都不错。最好有两个好的,逻辑上合理的候选答案然后寻找标准(通常在典型负载下的性能)来消除一个(但保留它注释掉以备将来重新测试!)