Gå til innhold

Algoritme for flytting av data fra en tabell til en annen


Anbefalte innlegg

Jeg jobber med Sql server 2005, og skal hente data fra flere kilder til en tabell. Problemet er at jeg nå har en kildetabell som mangler integritet på id. Det finnes altså flere rader med lik id i kilden, som skal over i mål-tabellen som har UNIQUE på akkurat det feltet. Derfor feiler

insert into targetTable(id, felt1, felt2) select id, felt1, felt2 from sourceTable

Jeg ser for meg å loope gjennom sourceTable og benytte noen slags if not exist-logikk for å sette inn raden i targetTable. Kan noen hjelpe meg med en slik loop-funksjon jeg kan benytte i sproc'en min ?

Lenke til kommentar
Videoannonse
Annonse

Det jeg omtaler som ID er egentlig organisasjonsnummer, og vil ikke være hovednøkkel i mål-tabellen min. Jeg har laget en ny id med autoincrement der. Litt senere tenkte jeg å utvide prosedyren til å også gjøre noe ved exist = true (splitte, update), så GROUP BY faller også litt ut.

Finnes noen slags FOR-EACH ROW funksjon i sql?

Det ville hvert trist og leit å måtte hente inn kildedataene til asp-løsningen i front for så å behandle de der...

 

Edit : forumet funker ikke med Chrome. Editor registrer ikke enter...

Endret av RulleRimfrost
Lenke til kommentar

Finnes noen slags FOR-EACH ROW funksjon i sql?

Det ville hvert trist og leit å måtte hente inn kildedataene til asp-løsningen i front for så å behandle de der...

 

Edit : forumet funker ikke med Chrome. Editor registrer ikke enter...

 

Du kan bruke en cursor kanskje?

 

(Enter funker forresten helt greit for meg i chrome)

 

Edit: Eksempelvis http://www.jackdonnell.com/articles/SQL_CURSOR.htm

 

Google etter "cursor tsql" så finner du mer.

Endret av quantum
Lenke til kommentar

Cursor ser ut til å være riktig ja. Den foreløpige løsningen ble hverken rask eller heldig, da jeg ikke vil at brukere skal kunne opprette tabeller.

Jeg oppretter en temp-tabell med stigende id og looper den:

 

declare @i int = 1;
declare @currentId varchar(11);
declare @rowCount int;
create table #tmpTable(id int identity(1,1) primary key, fakeId, field1, field2, osv...);

insert into #tmpTable (fakeId, field1, field2. osv...)
select * from sourceTable

set @rowCount = (select count(*) from #tmpTable);

while @i <> @rowCount
BEGIN
set @currentId = (select fakeId from #tmpTable where id = @i)

if not exists(select * from targetTable where fakeId = @currentId)
insert into targetTable (fakeId, field1, field2, osv...)
select fakeId, field1, field2, osv...
from #tmpTable
where id = @i;
set @i = @i + 1
END

 

Lenke til kommentar

Å huff. Testet cursor nå, og om jeg har gjort dette riktig er det grisetreigt. Følgende brukte 21 sek for en kildetabell på ca 10000 rader, der en while loop brukte under 2 sek :

 

declare clientList cursor fast_forward for
select fakeId from sourceTable;
declare @currentFakeId varchar(11);

open clientList;
fetch next from ClientList into @currentFakeId
while @@fetch_status = 0
BEGIN
if not exists(select * from targetTable where id = @currentFakeId)
insert into targetTable(fakeId, field1, field2, osv...)
select fakeId, field1, field2, osv...
from sourceTable
where fakeId = @currentFakeId
fetch next from ClientList into @currentFakeId
END

close clientList;
deallocate clientList;

Lenke til kommentar

Å huff. Testet cursor nå, og om jeg har gjort dette riktig er det grisetreigt. Følgende brukte 21 sek for en kildetabell på ca 10000 rader, der en while loop brukte under 2 sek :

 

declare clientList cursor fast_forward for
select fakeId from sourceTable;
declare @currentFakeId varchar(11);

open clientList;
fetch next from ClientList into @currentFakeId
while @@fetch_status = 0
BEGIN
if not exists(select * from targetTable where id = @currentFakeId)
insert into targetTable(fakeId, field1, field2, osv...)
select fakeId, field1, field2, osv...
from sourceTable
where fakeId = @currentFakeId
fetch next from ClientList into @currentFakeId
END

close clientList;
deallocate clientList;

 

Kan du ikke bare hente ut det du skal ha fra sourceTable direkte i cursoren så slipper du å slå opp i den tabellen en gang til?

 

Ikke sikkert det blir 10 ganger raskere, men det kunne jo være interessant å se...

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...