Avatar billede casper_skovgaard Nybegynder
21. september 2006 - 11:28 Der er 5 kommentarer og
1 løsning

Samle flere rækker i en

Jeg har følgende tabeller:

Documents: ID | Subject
Tags: DocumentID | Name


Jeg skal have lavet en query som viser tags for hvert dokument. Feks.

Doc1 | tag1,tag2
Doc2 | tag1,tag3

En række per dokument.

Er det muligt?
Avatar billede hardcorewizard Nybegynder
21. september 2006 - 12:47 #1
SELECT docs.Subject, tags.Name FROM Tags tags
  INNER JOIN Documents docs ON tags.DocumentID = docs.ID
WHERE (indsæt-din-expression)

Dette vil give dig

Doc1 | tag1
Doc1 | tag2
Doc2 | tag3


Jeg vil forresten gøre opmærksom på at dit eksempel er ugyldigt, når du siger at du skal have følgende returneret:

Doc1 | tag1,tag2
Doc2 | tag1,tag3

Da en tag-record kun har én reference til en document-record kan du ikke referere tag1 til både Doc1 og Doc2. Gør i stedet det at du opretter en tredje tabel der indeholder relationer mellem Documents og Tags-tabellen. Således:

CREATE TABLE Tags-Documents (
  id INT,
  Document_id INT,
  Tag_id INT
)
Avatar billede casper_skovgaard Nybegynder
21. september 2006 - 13:12 #2
Jeg har faktisk allerede en reference tabel, glemte lige at få den med.

Det jeg mere præcist har brug for er at putte data ind i en Dokument klasse som har to properties 1. Subject som er en string og 2. Tags som er et array.

Er det ikke muligt at lave et udtræk som ikke skal efterbehandles?
Avatar billede hardcorewizard Nybegynder
21. september 2006 - 15:56 #3
Ikke umiddelbart, da du jo ikke kan have et vilkårligt antal kolonner (det ville også være uhensigtsmæssigt at arbejde med). Ihvertfald ikke så vidt jeg ved.
Ellers skal du lave en query på et enkelt dokument, og dette dokument's tags. I så fald vil du jo have et array af tags, som rækker i dit resultset.
Det skulle dog ikke være den store opgave at efterbehandle dine data, hvilket sprog/miljø bruger du, og hvad er grunden til at du vil undgå det?
Avatar billede casper_skovgaard Nybegynder
21. september 2006 - 16:15 #4
Jeg bruger c#. Grunden er at jeg kunne slippe for efterbehandlingen, som måske vil gøre systemet langsommere end hvis data kom direkte fra en sql query.

Hvis du har et forslag til hvordan jeg gør det hurtigst i c# eller VB, vil jeg meget gerne høre om det.

Men smid lige et svar, for nu ved jeg det ikke kan lade sig gøre i sql. Og tak for hjælpen.
Avatar billede hardcorewizard Nybegynder
21. september 2006 - 16:48 #5
Det skal du ikke være bange for :). Medmindre du har en MEGET stor database, så burde det slet ikke være noget problem. Husk også på at det kun er din første databehandling der eventuelt kan tage lang tid. Når du behandler din data kan du jo evt. lægge den ned i et associativt array af en art, hvilket også gør din søgetid en del hurtigere (hvis du vel og mærke skal identificere dine tags på en tekststreng, ellers er en integer hurtigst).
Optimering kan udføres på mange måder, men jeg vil ikke mene at du opnår noget ved at lade databasen behandle dine data for dig, i stedet for at gøre det lokalt.
Avatar billede casper_skovgaard Nybegynder
22. september 2006 - 10:09 #6
Tak
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