避免插入重复行,其中“重复”是非平凡的

时间:2014-08-21 14:21:33

标签: sql

我的数据库包含一个设计为:

的表
| A | B | date | C | D | E |

给定一个具有相同设计的临时表,我希望将其内容插入到我的数据库中的永久表中。但是,我只想在temp中插入与最新行不同的行 temp.A = perm.A和temp.B = perm.B.行的新近度由日期列确定。

例如,给定一个看起来像的perm表:

| "Joe" | "Consultant" | 8/21/2014 | 40 | 72 | 54 |

| "Joe" | "Consultant" | 8/16/2014 | 25 | 72 | 30 |

然后是临时表行,如下所示:

| "Joe" | "Consultant" | 8/25/2014 | 40 | 72 | 54 |

不应插入,但

| "Joe" | "Consultant" | 8/25/2014 | 25 | 72 | 30 |

应。

当然,也应该插入具有先前不存在的A或B列条目的任何行。

我已经搞过几种方法来做这件事(包括迭代),但我不确定这是正确的方法是什么?我是SQL开发新手,所以任何建议都会有所帮助。

谢谢!

2 个答案:

答案 0 :(得分:0)

如果您的DBMS允许这样INSERT ... SELECT ...在SELECT部分​​中引用要插入的表,您可以使用以下内容:

INSERT INTO PERM
select * FROM TEMP T
where NOT EXISTS 
(select *
 from PERM P
 WHERE P.A=T.A and P.B=T.B and P.C=T.C and P.D=T.D and P.E=T.E
)

如果您的DBMS不允许引用,您可以插入" TEMP2",然后从那里插入所有内容到PERM

答案 1 :(得分:0)

试试这个:

insert into perm (a,b,c,d,e,f)
select
t.*
from
temp t left outer join
(
select
p.*
from
perm p inner join
(
select a, b, max(c) as max_c
from perm
group by a,b) mx on
p.a = mx.a and
p.b = mx.b and
p.c = max_c
  ) p on
t.a = p.a and
t.b = p.b and
t.c > p.c and
t.d = p.d and
t.e = p.e and
t.f = p.f
where
    p.a is null

sqlFiddle