我有一个SQL问题让我忙了好几天了。我想要的是将大多数行从一个表(ORIGIN)复制到另一个表(DESTINATION),但是,在DESTINATION中不应该有具有相同PRIMARY KEY的行。在ORIGIN中,我们可能会在给定时刻有许多重复项。好吧,到目前为止一切顺利,我们有很多方法,他们总是在MySQL工作(这是我一直合作的)。但现在我被迫使用SQL Server 2008。
到目前为止,我已尝试过NOT EXIST,NOT IN和JOIN方法。我做的并不重要,我总是得到臭名昭着的重复键错误。例如,如果我使用它:
insert into DESTINATION
select *
from ORIGIN
where ORIGIN.[MY-PRIMARY-KEY-FIELD] not in
(select [MY-PRIMARY-KEY-FIELD] from DESTINATION)
然后我明白了:
违反PRIMARY KEY约束' PK__DESTINAT__52F5604C11CBEE86'。无法在对象' dbo.DESTINATION'中插入重复键。重复键值为(00013884880195)。
当然,指定的值在ORIGIN中重复,但这就是为什么我在插入之前检查它是否也存在于DESTINATION中。我得到了与其他方法相同的确切错误消息。什么都行不通。
我唯一能想到的是,也许,这是线程或做奇怪的东西,以便在我们检查它时行仍然不存在。有没有办法强制某种"同步模式"以便在我们检查信息时尽快将信息推送到表中以确保数据存在?这是丢弃那个......的简单方法。
或许我在这里绕过愚蠢的事情。我不知道。因此,欢迎任何关于这里可能发生的事情的暗示。
事先谢谢。
答案 0 :(得分:0)
您可以在查询中使用NOT EXISTS
来查找与
INSERT INTO DESTINATION (colfk,col1, col2, col3)
SELECT * FROM (SELECT coppiesfk,coppiesRow1, coppiesRow2, coppiesRow3) AS tmp
WHERE NOT EXISTS (
SELECT colfk FROM DESTINATION WHERE colfk = coppiesfk
) LIMIT 1;
答案 1 :(得分:0)
可能这个更好的选择..
insert into DESTINATION
Select * from (
select <column_list>,
row_number() over (partition by PK order by PK ) as rnm
from origin)Temp
where rnm=1;
答案 2 :(得分:0)
您正在检查DESTINATION
ID
是否已ORIGIN
ORIGIN
,但如果ID
有两行DESTINATION
相同DISTINCT
在insert into DESTINATION
select DISTINCT *
from ORIGIN
where ORIGIN.[MY-PRIMARY-KEY-FIELD] not in
(select [MY-PRIMARY-KEY-FIELD] from DESTINATION)
中不存在,则会插入两行=&gt;重复密钥。
一种可能的变体 - 添加string
。
split