|
| Select distinct med bruge af sequence Fra : Flemming Mertz |
Dato : 15-11-03 20:24 |
|
Hej!
Jeg har et lille database spørgsmål, som sikkert er lige til at løse, men
som jeg ikke lige kan rumme.
Jeg har følgende tabel;
id titel aar forfatter emneord
Den er ikke normaliseret, men vist alligevel på første normalform. Anyway,
fordi der kan være flere forfattere til en bog, indeholder ovenstående tabel
masser af redundans, hvor der er mange ens rækker, som kun varierer i
forfatter. Data om forfatteren skal nu over i en seperat tabel, indeholdende
forfatter og et id:
forfatter: id, navn
Hvordan gør jeg lettest det? Jeg har prøvet mig lidt frem med følgende, som
logisk nok ikke virker, da næste værdi på min sequence returnerer en værdi,
mens select'en returnerer mange;
INSERT INTO forfatter(navn, id)
(SELECT DISTINCT forfatter FROM org_tabel), forfatter_seq.nextval;
Kan man gøre det i SQL, eller skal jeg over i en PL/SQL procedure, der
loop'er over distinct'e forfattere?
Med venlig hilsen, og på forhånd tak,
Flemming Mertz
| |
Jens Gyldenkærne Cla~ (15-11-2003)
| Kommentar Fra : Jens Gyldenkærne Cla~ |
Dato : 15-11-03 22:39 |
|
Flemming Mertz skrev:
> Data om forfatteren skal nu over i en seperat tabel, indeholdende
> forfatter og et id:
Fin ide.
> Hvordan gør jeg lettest det?
Hvilken database arbejder du med? I de fleste databaser kan man
definere et autonummereringsfelt - det er meget let at arbejde med.
> INSERT INTO forfatter(navn, id)
> (SELECT DISTINCT forfatter FROM org_tabel),
> forfatter_seq.nextval;
Hvis id er defineret som en autonummertype, kan du nøjes med at
skrive:
INSERT INTO forfatter (navn)
SELECT DISTINCT forfatter FROM org_tabel
--
Jens Gyldenkærne Clausen
»Diplomatiet består netop i, at de gamle kommatister kan få lov til
at tro, at de har vundet. Men i virkeligheden har de tabt.«
Ole Togeby i Information
| |
Troels Arvin (15-11-2003)
| Kommentar Fra : Troels Arvin |
Dato : 15-11-03 22:53 |
|
On Sat, 15 Nov 2003 20:23:50 +0100, Flemming Mertz wrote:
> Den er ikke normaliseret, men vist alligevel på første normalform.
Hvis emneord-kolonnen er tiltænkt en række emneord, bryder du første
normalform.
> INSERT INTO forfatter(navn, id)
> (SELECT DISTINCT forfatter FROM org_tabel), forfatter_seq.nextval;
Du kan sikkert godt massere noget SQL frem i den stil, som også vil
virke. Men ligesom Jens ville jeg nok sørge for, at id-kolonnen i
forfatter-tabellen automatisk øger sig selv, og da køre:
INSERT INTO forfatter (navn)
SELECT DISTINCT forfatter
FROM books;
Dette virker i hvertfald på PostgreSQL, og jeg vil mene, at det også
vil spille i Oracle.
Sådan sørger du i Oracle for, at der til en kolonne automatisk genereres
værdier:
http://troels.arvin.dk/db/rdbms/#mix-identity-oracle
--
Greetings from Troels Arvin, Copenhagen, Denmark
| |
Flemming Mertz (15-11-2003)
| Kommentar Fra : Flemming Mertz |
Dato : 15-11-03 23:45 |
|
Tak skal i have, begge to. Jeg var jo ude i noget af det rigtige med at
tælle id'er op, men havde ikke lige tænkt på at lade tabellen selv gøre
det..
Tak!
F.
"Troels Arvin" <troels@arvin.dk> skrev i en meddelelse
news:pan.2003.11.15.21.52.40.339489@arvin.dk...
> On Sat, 15 Nov 2003 20:23:50 +0100, Flemming Mertz wrote:
>
> > Den er ikke normaliseret, men vist alligevel på første normalform.
>
> Hvis emneord-kolonnen er tiltænkt en række emneord, bryder du første
> normalform.
>
> > INSERT INTO forfatter(navn, id)
> > (SELECT DISTINCT forfatter FROM org_tabel), forfatter_seq.nextval;
>
> Du kan sikkert godt massere noget SQL frem i den stil, som også vil
> virke. Men ligesom Jens ville jeg nok sørge for, at id-kolonnen i
> forfatter-tabellen automatisk øger sig selv, og da køre:
>
> INSERT INTO forfatter (navn)
> SELECT DISTINCT forfatter
> FROM books;
>
> Dette virker i hvertfald på PostgreSQL, og jeg vil mene, at det også
> vil spille i Oracle.
>
> Sådan sørger du i Oracle for, at der til en kolonne automatisk genereres
> værdier:
> http://troels.arvin.dk/db/rdbms/#mix-identity-oracle
>
> --
> Greetings from Troels Arvin, Copenhagen, Denmark
>
| |
Flemming Mertz (16-11-2003)
| Kommentar Fra : Flemming Mertz |
Dato : 16-11-03 08:46 |
|
Hej igen
Så kommer anden del af denne opdeling af tabeller, som jeg eller troede jeg
havde styr på.
Jeg har jo nu en reduceret bogtabel, som under normaliseringen har fået
fjernet en del attributter. Derudover har jeg en forfattertabel, nu med alle
forfattere i, og til at linke de to tabeller i en mange-til-mange relation,
har jeg en seperat tabel, forfatter_bog. Den skal jeg have befolket fra den
oprindelige bogtabel, og fra min nye forfattertabel, men det SQL jeg har
brygget sammen har nu stået og tygget i fem minutter, hvor forfatter SQL'en
kun tog et par sekunder.
Kan i se hvad der er galt, og eventuelt komme med et godt råd? Om ikke andet
kan i måske få jer et godt morgengrin..
INSERT INTO bog_forfatter (forfatter_id, bog_id)
SELECT DISTINCT id, (SELECT id FROM forfatter WHERE forfatter.navn =
org_bog.forfatter) FROM org_bog;
Med venlig hilsen,
Flemming Mertz
| |
Lars Dybdahl (16-11-2003)
| Kommentar Fra : Lars Dybdahl |
Dato : 16-11-03 09:41 |
|
Flemming Mertz wrote:
> Jeg har følgende tabel;
> Den er ikke normaliseret, men vist alligevel på første normalform.
Man normaliserer ikke en database - men normaliserer sin datamodel.
Databasen er en optimeret implementering af en datamodel, og her bryder man
ofte normaliseringen for at optimere gemning og hentning.
Lars.
--
Freelance programmør
| |
Flemming Mertz (16-11-2003)
| Kommentar Fra : Flemming Mertz |
Dato : 16-11-03 10:48 |
|
Hehe, tak for denne præcisering.
Dette er jeg nu godt klar over, og jeg beklager min fortalelse. Men måske du
kunne tage et kig på den postering jeg lige har lavet, angående følgende
statement. Den kunne i hvert fald godt bruge en omgang optimering..
INSERT INTO bog_forfatter (forfatter_id, bog_id)
SELECT DISTINCT id, (SELECT id FROM forfatter WHERE forfatter.navn =
org_bog.forfatter) FROM org_bog;
Med venlig hilsen,
Flemming Mertz
| |
|
|