Gå til innhold

Anbefalte innlegg

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
Videoannonse
Annonse

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

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

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

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...