13. februar 2007 - 10:24Der er
14 kommentarer og 1 løsning
Overførsel af data mellem to tabeller
Sagen er den at jeg har en tabel i min db med oplysninger om mine kunder. Nu har jeg så fået en ny 'tom' liste med kunder som jeg har lagt ind i en ny tabel i den samme db.
Jeg vil gerne lave en import af de nye kunder over i den eksisterende tabel, MEN her kommer problemet så! Da der er gengangere i tabellen med nye kunder, skal den hvis der er udfyldt det samme i bare eet af felterne IKKE kopierer dem med over.
insert into tabel2 (kundeid, felt1, felt2, felt3) select kundeid, felt1, felt, felt3 from tabel1 t1 where not exists(Select * from tabel2 where kundeid = t1.kundeid)
>>Hvad er "t1" ('from tabel1 t1')?? t1 er bare et alias for tabel1, så jeg på et senere tidspunkt bruger t1.kundeid, og ikke tabel1.kundeid. I en så lille SQL , og med korte tabelnavn, er det måske unødvendig med alias. Hvis det er lange tabelnavne, kan det nogle gange være en fordel at give en tabel et alias.
>>Men 'instnr' er jo ikke den unikke id - har det noget at sige i forhold til dit script?
Vil din 'instr' kunne identificere én kunde? Vil du kunne bruge dette felt alene, til at kunne bestemme om en kunde allerede er oprættet begge tabeller?
I så fald, ville jeg lægge et index på dette felt, ihvertfald på den tabel som du skla overflyte data til. Din SQL kunne i så fald se nogelunde således ud (du må bytte ud tabel1 og tabel2 med rigtige tabelnavne):
I udgangspunktet bruger man clustered index først og fremmest på primary key, altså et enkelt felt, eller en samling af felter, som giver en unik identifikation af hver enkelt record.
Hver tabel kan have max en clustred index, og måden clustered index adskiller sig fra øvrige indexer, er at clustered index bestemmer hvordan data i den aktuelle tabel skal lagres fysisk. Øvrige indexer ændrer ikke på måden data lagres på i selve data tabellen, men laver egen 'index'-tabel hvor den holder styr på rækkefølgen, og hvor den refererer til den ekelte records i data tabellen.
Men inden du begynder at ændre clustered index/primary key, så må du kende applikationen, og brug af indexer, rimelig godt. Med mindre applikationen er egenudviklet, vil jeg frafåde at ændre clustered index/primary key, med mindre dette er aftale med leverandø.
Hvis databasen er egenudviklet, vil jeg foreslå at du definerer en primary key, gerne med Instnr som første/eneste element i primary key, og laver primary key til clustered index. Så vil data i tabellen efterfølgende blive fysisk flyttet rundt på, således at de bliver soreteret og lagret i den rækkefølge som clustered index indikerer.
Måske er ovenstående forklaring ikke 100% rigtig i forhold til hvordan data lagres fysisk på disk, data lagres i såkaldte pages, hvor rækkefølge inden for en page er bestemt af clustered index, men rækkefølgen af pages behøvr ikke være sorteret på harddisken. Men glem det her, da data ihvertfald logisk vil være lagret i sorteret rækkefølge.
Jeg vil anbefale dig at læse lidt om indexer og clustered/unclustered indexer i SQL Books online, eller søg på internet.
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.