19. maj 2010 - 23:46Der er
3 kommentarer og 1 løsning
lave tjek af andre rækker end dem der skal returneres
Jeg har et kald som skal tjekke om der plads til en order. I eksemplet herunder skal der laves en order som skal fra odense til Amsterdam og der tjekkes at der ikke er over 25 containere, på start og slut tidspunktet. Problemet er så at det der også gerne skulle tjekket for alle række imellem de to, således at der heller ikke er over 25 containere på nogen af dem. (dvs, i dette tilfælde ikke må være over 25 container i kiel og hamborg). Som det er nu vil både skib 1 og 2 bliver returneret. Men da skib 2 har over 25 containere i kiel, skal dette ikke med Er dette muligt at lave et sådan kald?
SELECT d1.ShipID AS ship, d1.schedulingID AS startSID, d1.eventDate AS startDate, d2.schedulingID AS endSID, d2.eventDate AS endDate, d1.currentContainers AS startC, d2.currentContainers as endC FROM Scheduling d1, Scheduling d2 WHERE d1.currentContainers <= 25 AND d2.currentContainers <= 25 AND d1.harbour='Odense' And d1.eventType='Departure' AND d2.harbour='Hamburg' And d2.eventType='Arrival' AND d1.shipID=d2.shipID
Din query, som drejer sig om skibe mellem Odense og Hamburg, returnerer kun skib1 fordi skib2 ved ankomst til Hamburg har 30 containers. Skulle det have vaeret "..AND d2.harbour='Amsterdam'.."? I saafald returneres baade skib1 og skib2 fordi queryen ikke kan se at der i mellemtiden har vaeret loads paa over 25.
Det kan du fikse ved at indsaette et NOT EXISTS kriterium saaledes:
SELECT d1.ShipID AS ship, d1.schedulingID AS startSID, d1.eventDate AS startDate, d2.schedulingID AS endSID, d2.eventDate AS endDate, d1.currentContainers AS startC, d2.currentContainers as endC FROM ss_l d1, ss_l d2 WHERE d1.currentContainers <= 25 AND d2.currentContainers <= 25 AND d1.harbour='Odense' And d1.eventType='Departure' AND d2.harbour='Amsterdam' And d2.eventType='Arrival' AND d1.shipID=d2.shipID AND NOT EXISTS(SELECT * FROM ss_l WHERE ShipID = d1.ShipID AND currentContainers > 25)
Jeg skulle have sagt at for testformaal lavede jeg en tabel der hed ss_1 i stedet for Scheduling. Derfor forekommer navnet ss_l i NOT EXISTS SELECT saetningen.
Hvis man ændre indholdet af tabellen til følgende. Så vil skib 2 ikke komme med, selv om der faktisk er plads, da orden kun går fra "odense" til "Amsterdam". Er det muligt at ændre den query du lavede således at der også tages højde for efterfølgende rækker i tabellen ikke har noget at sige. Så kun rækker imellem afgang og ankomst sted tjekkes.
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.