Avatar billede rasmus_damberg Nybegynder
13. februar 2007 - 10:24 Der 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.

Nogen der har en løsning på den?
Avatar billede lorentsnv Nybegynder
13. februar 2007 - 10:32 #1
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)
Avatar billede lorentsnv Nybegynder
13. februar 2007 - 10:33 #2
Har du et kundeid/kundenavn som du kan checke på, eller er det flere felter du må checke på, for at se om der er gengangere?
Avatar billede rasmus_damberg Nybegynder
13. februar 2007 - 10:41 #3
jeg har et nemlig ligepræcis et kundeid "instrnr" og det er det eneste den behøver at tjekke på...

Hvad er "t1" ('from tabel1 t1')??
Avatar billede rasmus_damberg Nybegynder
13. februar 2007 - 10:48 #4
Her er alle felterne for god ordens skyld:

[Id, Oprettet d, Instnr, Kunde, KUNDEADRESSE, POSTNUMMER, BY_, BELIGGENHEDSKOMMUNE, INSTITUTIONSTYPE, AKTUEL_EJER, KOMMENTARER, Produkt, LISTEPRIS, Abn_start_dato, BETALINGSDATO, Abn_slut_dato, Kontaktperson, AKTIV, Fak kundenr, Betaler navn, Fak adresse, POSTNR, Fak by, Betaler kontaktperson, EAN, DR_pris, DR_ordre_nr, DR_kontrakt_afs, DR_kontrakt_modt, DR_faktura, DR_kursus, DR_kursus_person, EMAIL, Betaler mail, ProdType, ProdAntal, ProdVarighed, KontraktAfs, KontraktModt, Faktureret, OrdrerNr, Faktureret06]

Det er instrnr det skal checke...
Avatar billede rasmus_damberg Nybegynder
13. februar 2007 - 10:51 #5
Men 'instnr' er jo ikke den unikke id - har det noget at sige i forhold til dit script?
Avatar billede lorentsnv Nybegynder
13. februar 2007 - 11:18 #6
>>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.
Avatar billede lorentsnv Nybegynder
13. februar 2007 - 11:22 #7
>>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):


insert into tabel2 (Id, Oprettet d, Instnr, Kunde, KUNDEADRESSE, POSTNUMMER, BY_, BELIGGENHEDSKOMMUNE, INSTITUTIONSTYPE, AKTUEL_EJER, KOMMENTARER, Produkt, LISTEPRIS, Abn_start_dato, BETALINGSDATO, Abn_slut_dato, Kontaktperson, AKTIV, Fak kundenr, Betaler navn, Fak adresse, POSTNR, Fak by, Betaler kontaktperson, EAN, DR_pris, DR_ordre_nr, DR_kontrakt_afs, DR_kontrakt_modt, DR_faktura, DR_kursus, DR_kursus_person, EMAIL, Betaler mail, ProdType, ProdAntal, ProdVarighed, KontraktAfs, KontraktModt, Faktureret, OrdrerNr, Faktureret06)
select Id, Oprettet d, Instnr, Kunde, KUNDEADRESSE, POSTNUMMER, BY_, BELIGGENHEDSKOMMUNE, INSTITUTIONSTYPE, AKTUEL_EJER, KOMMENTARER, Produkt, LISTEPRIS, Abn_start_dato, BETALINGSDATO, Abn_slut_dato, Kontaktperson, AKTIV, Fak kundenr, Betaler navn, Fak adresse, POSTNR, Fak by, Betaler kontaktperson, EAN, DR_pris, DR_ordre_nr, DR_kontrakt_afs, DR_kontrakt_modt, DR_faktura, DR_kursus, DR_kursus_person, EMAIL, Betaler mail, ProdType, ProdAntal, ProdVarighed, KontraktAfs, KontraktModt, Faktureret, OrdrerNr, Faktureret06
from tabel1 t1
where not exists(Select * from tabel2 where kundeid = t1.kundeid)
Avatar billede lorentsnv Nybegynder
13. februar 2007 - 11:24 #8
Det forrige svar blev desværre sendt, inden jeg fik rettet SQL'en helt, da sidste linie skal tilpasses:

insert into tabel2 (Id, Oprettet d, Instnr, Kunde, KUNDEADRESSE, POSTNUMMER, BY_, BELIGGENHEDSKOMMUNE, INSTITUTIONSTYPE, AKTUEL_EJER, KOMMENTARER, Produkt, LISTEPRIS, Abn_start_dato, BETALINGSDATO, Abn_slut_dato, Kontaktperson, AKTIV, Fak kundenr, Betaler navn, Fak adresse, POSTNR, Fak by, Betaler kontaktperson, EAN, DR_pris, DR_ordre_nr, DR_kontrakt_afs, DR_kontrakt_modt, DR_faktura, DR_kursus, DR_kursus_person, EMAIL, Betaler mail, ProdType, ProdAntal, ProdVarighed, KontraktAfs, KontraktModt, Faktureret, OrdrerNr, Faktureret06)
select Id, Oprettet d, Instnr, Kunde, KUNDEADRESSE, POSTNUMMER, BY_, BELIGGENHEDSKOMMUNE, INSTITUTIONSTYPE, AKTUEL_EJER, KOMMENTARER, Produkt, LISTEPRIS, Abn_start_dato, BETALINGSDATO, Abn_slut_dato, Kontaktperson, AKTIV, Fak kundenr, Betaler navn, Fak adresse, POSTNR, Fak by, Betaler kontaktperson, EAN, DR_pris, DR_ordre_nr, DR_kontrakt_afs, DR_kontrakt_modt, DR_faktura, DR_kursus, DR_kursus_person, EMAIL, Betaler mail, ProdType, ProdAntal, ProdVarighed, KontraktAfs, KontraktModt, Faktureret, OrdrerNr, Faktureret06
from tabel1 t1
where not exists(Select * from tabel2 where Instnr= t1.Instnr)
Avatar billede rasmus_damberg Nybegynder
13. februar 2007 - 12:21 #9
Det virkede sørme! Tusinde tak!!!
Avatar billede lorentsnv Nybegynder
13. februar 2007 - 12:31 #10
:-)
Avatar billede rasmus_damberg Nybegynder
13. februar 2007 - 13:34 #11
Eneste problem er at de forskellige ID nu ligger hulter til bulter :( er det noget man kan gøre noget ved?
Avatar billede lorentsnv Nybegynder
13. februar 2007 - 13:41 #12
Hvis det er de records som insertes du mener kommer i uønsket rækkefølge, kan du eventuelt tilføje følgende linie til sidst i SQL'en:
Order by ID

Var det svar på dit spørgsmål?
Avatar billede lorentsnv Nybegynder
13. februar 2007 - 13:42 #13
Du kan eventuelt også bruge en clustred index på ID, hvis du ønsker din tabel automatisk skal sorteres efter ID.
Avatar billede rasmus_damberg Nybegynder
13. februar 2007 - 15:42 #14
Ok hvordan funger det med clustred index - er det et kapitel for sig selv?
Avatar billede lorentsnv Nybegynder
14. februar 2007 - 10:46 #15
Clustered index er ikke særlig svært.

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.

Du kan bl.a. læse lidt mere om clustered indexer i følgende artikkel:
http://www.sql-server-performance.com/clustered_indexes.asp
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester