Amos Skrevet 22. september 2007 Del Skrevet 22. september 2007 Jeg har en database som bl.a. består av tabellene Ressurs, Service, ServiceMapping og Utleie. Ressurser kan være lastebiler, båter, personer osv. Servicer er sammensatt av ressurser slik at en aktuell service kan være sammensatt av både en lastebil og en person (fører) og også andre relevante ressurser. I utleie tabellen registreres utleie av ressurser slik at en lastebil A kan være utleid i tidsrommet 1.1.07-3.1.07, mens en annen ressurs (som gjerne kan tilhøre samme service som lastebil A) kan være utleid i et annet tidsrom. Det jeg ønsker er å lage et søk som finner alle servicer hvor ikke en av ressursene som tilhører denne servicen er registrert som utleid i det tidsrommet brukeren ønsker å leie det. (Hvis serviceID 1 består av ressursID 1 og ressursID 2, og ressursID 2 er utleid i det gitte tidsrommet, så skal ikke serviceID 1 dukke opp i et søk) SELECT DISTINCT s.ServiceID, s.Navn FROM ServiceMapping AS rl INNER JOIN Ressurs AS r ON rl.RessursId = r.RessursId INNER JOIN Service AS s ON rl.ServiceId = s.ServiceID INNER JOIN Utleie AS c ON r.RessursId = c.RessursId WHERE (c.FraTid NOT BETWEEN @FraTid AND @TilTid) AND (c.TilTid NOT BETWEEN @FraTid AND @TilTid) Problemet med denne spørringen er at den kun tar med seg servicer som har ressurser registrert i Utleie-tabellen. Jeg ønsker selvsagt også ta med servicer som har ressurser som ikke er registrert utleid. Noen som kan hjelpe? Lenke til kommentar
qdos Skrevet 22. september 2007 Del Skrevet 22. september 2007 Kan du ikke bruke UNION for å legge til en ny spørring på servicer som har ressurser som ikke er registrert utleid? Lenke til kommentar
blackbrrd Skrevet 26. september 2007 Del Skrevet 26. september 2007 SQL har en litt annen tankegang enn annen programmering, i utgangspunktet så har du alle dataene, deretter bruker du where/on clausen til å minske antallet treff. I utgangspunktet så har du alle servicer, så skal du fjerne alle servicer som har en ressurs opptatt i ett gitt tidsrom SELECT * FROM servicetabellen WHERE serviceid NOT IN (SELECT id_serviceid FROM ressurstabell WHERE opptatt i periode) Er litt usikker på hvordan tabellene dine henger sammen, men du skjønner sikkert eksempelet mitt fordet Lenke til kommentar
siDDis Skrevet 27. september 2007 Del Skrevet 27. september 2007 Tips, unngå bruk av NOT IN/IN når du skal kjøre subselects, då er NOT EXISTS/EXISTS i blant mykje meir effektivt. Lenke til kommentar
Amos Skrevet 3. oktober 2007 Forfatter Del Skrevet 3. oktober 2007 Takk for god hjelp! Jeg har imidlertid møtt på et annet problem. Det har seg slik at en service kan bestå av flere ressurser, og disse ressursene kan også leies ut utenom servicen. Dette betyr at hver service har ressurser som er utleid til forskjellige tidsrom. Denne spørringen under gir meg egentlig svaret på det jeg spurte om i forrige omgang (ser ihvertfall slik ut): select name from Service where ServiceID in(select DISTINCT serviceID from ResourceList where ResourceId IN (select DISTINCT ResourceId from RHCalendar where ResourceId NOT IN (select ResourceId from RHCalendar where FromTime >= @FromTime and FromTime <= @ToTime and ToTime >= @FromTime and ToTime <= @ToTime))) Men, dette skal jo brukes i en praktisk funksjonalitet i et system (hypotetisk sett hvertfall) og jeg ønsker at når en bruker legger inn fra og til tidspunkt, så skal alle servicer som har en av sine ressurser utleid i dette tidsrommet IKKE dukke opp i listen over tilgjengelige servicer. Slik det er nå kan en service som har en av sine ressurser utleid i denne perioden dukke opp i listen allikevel p.g.a. at en av de andre ressursene underlagt servicen ikke er utleid i det aktuelle tidsrommet. Lenke til kommentar
Amos Skrevet 3. oktober 2007 Forfatter Del Skrevet 3. oktober 2007 Fant en løsning på siste innlegg. La til nok en subquery slik at spørringen virket som jeg ville (og slik at sql-koden ble enda styggere ) Takk for god hjelp! Jeg har imidlertid møtt på et annet problem. Det har seg slik at en service kan bestå av flere ressurser, og disse ressursene kan også leies ut utenom servicen. Dette betyr at hver service har ressurser som er utleid til forskjellige tidsrom. Denne spørringen under gir meg egentlig svaret på det jeg spurte om i forrige omgang (ser ihvertfall slik ut): select name from Service where ServiceID in(select DISTINCT serviceID from ResourceList where ResourceId IN (select DISTINCT ResourceId from RHCalendar where ResourceId NOT IN (select ResourceId from RHCalendar where FromTime >= @FromTime and FromTime <= @ToTime and ToTime >= @FromTime and ToTime <= @ToTime))) Men, dette skal jo brukes i en praktisk funksjonalitet i et system (hypotetisk sett hvertfall) og jeg ønsker at når en bruker legger inn fra og til tidspunkt, så skal alle servicer som har en av sine ressurser utleid i dette tidsrommet IKKE dukke opp i listen over tilgjengelige servicer. Slik det er nå kan en service som har en av sine ressurser utleid i denne perioden dukke opp i listen allikevel p.g.a. at en av de andre ressursene underlagt servicen ikke er utleid i det aktuelle tidsrommet. 9624346[/snapback] Lenke til kommentar
Anbefalte innlegg
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 kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå