SQL Server stored procedure: UPDATE with lowest value, else INSERT if there's already a value -
migrating 20k rows or @ once, hopefully. been away sql on 10 years , struggling.
i may going entirely wrong. need update table1.value2
lowest value table2.value1
, unless there's value2
. if latter, need insert row value table1.value1
.
table1.value1
lowest value of each id row. value2
needs next lowest.
current table1:
id1, 123, [empty] id4, 111, [empty]
current table2:
id1, 224 id1, 331 id4, 210 id4, 551
table1 - desired state:
id1, 123, 224 id1, 331, [empty] id4, 111, 210 id4, 551, [empty]
table2 - desired state:
[empty]
here's tried , update section works correctly. insert never works. think coded myself corner.
create procedure dbo.broken --declare variables declare @id int, @value1 int, @value2 int, @tmpvalue int --declare counter declare @counter int set @counter = 1 --declare cursor query declare ctable1 cursor read_only select id,value1, value2 table1 open ctable1 --fetch variables fetch next ctable1 @id, @value1, @value2 --loop while @@fetch_status = 0 begin if (@value2 = '' or @value2 null) begin --update table1.value2 next lowest table1.value2 > table1.value1 set @tmpvalue = (select min(value1) table2 value1 > @value1 , id = @id) update table1 set value2 = @tmpvalue id = @id --delete affected row table2 delete table2 value1 = @tmpvalue , id = @id; end else begin --insert row in table1 id, value1 table2 set @id = (select min(id) table2) set @tmpvalue = (select min(value1) table2 id = @id) insert table1(id, value1, value2) values (@id, @tmpvalue, '') delete table2 id = @id end --fetch next variables fetch next ctable1 @id, @value1, @value2 end --close cursor table close ctable1 deallocate ctable1
there 20 thousand rows, i'm hoping stored procedure accomplish all. it's one-off, i'm not super concerned overhead.
the basic query needed update pretty clear:
update table1 set value2 = ( select min(t2.value1) table2 t2 t2.value1 > table1.value1 , t2.id = table1.id )
i perform insert this:
insert table1 (id, value1, value2) select id, value1, [empty] table2 t2 left join table1 t1 on t2.id = t1.id , t2.value1 = t1.value1 left join table1 t1a on t2.id = t1a.id , t2.value1 = t1a.value2 t1.id null , t1a.id null delete table2
note meets stated requirements, may not meet actual requirements - comment @jeroenmostert covers number of issues.
Comments
Post a Comment