所以我有这个临时表,其结构如下:
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将返回一行)如何只插入我的联合查询中当前临时表中不存在的那些行?
答案 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)
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的答案看起来都不错。最好有两个好的,逻辑上合理的候选答案然后寻找标准(通常在典型负载下的性能)来消除一个(但保留它注释掉以备将来重新测试!)