我跟随两个表
create table #temp(id int,rid int)
insert into #temp
select 1,1
union all
select 2,1
union all
select 3,1
select * from #temp
drop table #temp1
create table #temp1(id int, nid int,PRIMARY KEY CLUSTERED
(
id asc,nid asc
))
insert into #temp1
select 1,10
union all
select 2,10
union all
select 2,11
union all
select 3,10
以下是两个结果集:
id rid
1 1
2 1
3 1
id nid
1 10
2 10
2 11
3 10
我想通过匹配两个表中的id字段来更新#temp1表,其值来自#temp表的rid字段。请参阅以下查询:
select a.*
from #temp1 a inner join #temp b
on a.id = b.id
where a.id <> b.rid
它返回:
id nid
2 10
2 11
3 10
我想用以下查询更新id:
update a
set a.id = b.rid
-- select a.*
from #temp1 a inner join #temp b
on a.id = b.id
where a.id <> b.rid
但它返回
由于表#temp1中的主键,主键冲突错误。
我想删除该值,如果它已经存在,如果没有那么我想更新
例如,id nid 1 10 2 10--想要更新但不能这个bcoz它违反主键所以删除这一行。 2 11--能够更新此行,但其他2行会导致问题。 3 10--想要更新但不能这个bcoz它违反了主键,所以删除这一行。
请建议其他方法。
答案 0 :(得分:0)
因为您违反了Primary Key Constraints
检查下表
select B.*
from #temp1 a inner join #temp b
on a.id = b.id
where a.id <> b.rid
id rid
2 1
2 1
3 1
select * from #temp1
id nid
1 10
2 10
2 11
3 10
您正在使用#temp中已加入#temp1
的连接设置上面第一个表的ID您尝试更新已在#temp1中的值,其中id = 2,2,3
答案 1 :(得分:0)
select *
from #temp1 a inner join #temp b
on a.id = b.id
where a.id <> b.rid
您将两个id 2记录更新为相同的值。你不能这样做,期间。没有其他方法可以解决这个问题,除了丢弃我认为不好的PK。
您可能需要在pdate中进一步定义以指定要更新的多个记录中的哪一个,或者您可能需要删除在执行更新之前可能最终为重复的记录。不了解您实际想要完成的业务规则或数据意味着什么,不可能说出您可以做些什么来解决您的问题。在这种情况下,解决方案取决于含义,当然我们在这里没有任何意义。