/ Forside / Teknologi / Udvikling / SQL / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
SQL
#NavnPoint
pmbruun 1704
niller 962
fehaar 730
Interkril.. 701
ellebye 510
pawel 510
rpje 405
pete 350
gibson 320
10  smorch 260
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



Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408925
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste