Gå til innhold

[Løst]Spørringer som henter data fra flere tabeller


Anbefalte innlegg

Hei og hå folkens

 

Jeg er i en situasjon der jeg trenger å hente data fra flere tabeller inn i samme view. Det er ingen definerte relasjoner mellom disse da de er basert på forskjellige kriterier.

 

Datamodellen har følgende tabeller av interresse:

Dokumenter, Kunder, Prosjekter.

I tillegg har vi en tabbel kallt KundeRelations. Denne er koblet til de forskjellige entitetene. Felles for alle postene i KundeRelations er at de alltid har en kobling til Kunder.

 

Relasjonen er litt spesiell fordi den kobler til entitetene på følgende måte:

Kunderelation.EntityTypt INT

Kunderelation.EntityGUID VARCHAR(36)

 

Alle tabellene bruker GUID som identifikator. Derfor vil feltet EntityGUID bli brukt som "relasjon" mellom KundeRelation og alle andre entiteter.

 

I tillegg er det slik at det på Dokumenter er et felt som heter ProjectGUID. Dette for å koble dokumenter mot Prosjekter.

 

Så til problemet:

Jeg trenger å finne alle dokumentene som er relatert mot en valgt kunde. Jeg skal med andre ord ikke bare ha dokumentene som er relatert gjennom KundeRelations.EntityGUID, men også dokumentene som igjen er tilknyttet prosjektene som kunden måtte ha. Det betyr følgende:

 

Kunder ->> KundeRelations <-> Dokumenter

Kunder ->> Project ->> Dokumenter

 

Den siste linjen gjelder fordi kundens GUID også er registrert på prosjektet.

 

Videre må dette SELECT statementet kunne defineres som et VIEW på SQL serveren fordi utviklingsverktøyet jeg bruker klarer ikke bruke STOREDPROCEDURE som "tabell"

 

All hjelp mottas med stor takk

Endret av HDSoftware
Lenke til kommentar
Videoannonse
Annonse

Hvorfor skal du bruke en nøkkel på 36 tegn til å koble sammen to tabeller? Det lukter av dårlig databasedesign.

 

varchar(36) opptar 36 bytes, mens en integer vil oppta 4 bytes. Mao 9 ganger så stort plassbehov. Mao blir indeksen 9 ganger så stor. Noe som igjen fører til at du må ha 9 ganger så mye minne for å holde indeksen i minnet.

 

Du må nesten vise oss create table statementet til de fire tabellene for at det skal være mulig å hjelpe deg med å lage spørringen du vil ha.

Lenke til kommentar

blackbrrd: enkelte rammeverk bruker primærnøkler med varchar(36) (32 tegn med 4 bindestreker for å dele opp) til å lagre nøkler som skal være unike for hele databasen, ikke bare tabellen. Jeg vet ikke om dette er tilfellet her, men det er en mulig forklaring.

Endret av G2Petter
Lenke til kommentar

Blackbrrd har selvsagt helt rett.

At SQL Server Management Studio presenterer GUIDen slik: 6F9619FF-8B86-D011-B42D-00C04FC964FF, betyr ikke at det lagres som en streng, på samme måte som en dato+tid ikke lagres som en human-readable streng, men som enten 4(shortdatetime) eller 8(longdatetime) bytes.

GUIDen over består av 16 bytes, selv om presentasjonen av den er 36 bytes.

 

Kjør følgende og sjekk output fra de to nederste spørringene.

declare @u uniqueidentifier

select @u=newid()

select @u
select convert(varbinary(16),@u)

Endret av kaffenils
Lenke til kommentar

Det stemmer. Men jeg har ikke laget algoritmen slik (ser at jeg burde ha gjort det). Vi har nemlig laget GUID produksjo0nen selv og følger ingen standard på dette. Vår GUID er bygget opp av helt bestemte verdier. Men ja, jeg kunne godt laget den om slik at den ble lagret som en BYTE(16)

 

Men samme det. Problemet er løst ;-)

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...