Avatar billede ss-l Nybegynder
19. maj 2010 - 23:46 Der 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

oprettelse af tabel:
CREATE TABLE Scheduling (
    schedulingID                      INT(4)            NOT NULL    AUTO_INCREMENT,
    eventType                    VARCHAR(10)    NOT NULL,
    eventDate                      date            NOT NULL,
    harbour                        VARCHAR(30)    NOT NULL,
    shipID                      INT(4)            NOT NULL,
    currentContainers        INT(4)            NOT NULL,
    PRIMARY KEY (schedulingID)   
);
INSERT INTO Scheduling (eventType,eventDate,harbour,shipID,currentContainers) VALUES
    ('Departure', '2010-05-02', 'Odense', 1, 0),
    ('Arrival', '2010-05-03', 'Kiel', 1, 0),
    ('Departure', '2010-05-04', 'Kiel', 1, 0),
    ('Arrival', '2010-05-05', 'Hamburg', 1, 0),
    ('Departure', '2010-05-06', 'Hamburg', 1, 0),
    ('Arrival', '2010-05-07', 'Amsterdam', 1, 0),
    ('Departure', '2010-05-02', 'Odense', 2, 0),
    ('Arrival', '2010-05-03', 'Kiel', 2, 0),
    ('Departure', '2010-05-04', 'Kiel', 2, 30),
    ('Arrival', '2010-05-05', 'Hamburg', 2, 30),
    ('Departure', '2010-05-06', 'Hamburg', 2, 0),
    ('Arrival', '2010-05-07', 'Amsterdam', 2, 0)
;

Der bruges en MySQL-database.
Håber i kan hjælpe

- ss-l
20. maj 2010 - 07:06 #1
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)
20. maj 2010 - 19:28 #2
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.
Avatar billede ss-l Nybegynder
20. maj 2010 - 20:31 #3
Mange tak for hjælpen. Lige hvad jeg skulle bruge!!!

Ps. Ja det skulle have været d2.harbour='Amsterdam'. godt du kunne gætte det :)

- ss-l
Avatar billede ss-l Nybegynder
20. maj 2010 - 21:32 #4
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.

INSERT INTO Scheduling (eventType,eventDate,harbour,shipID,currentContainers) VALUES
    ('Departure', '2010-05-02', 'Odense', 1, 0),
    ('Arrival', '2010-05-03', 'Kiel', 1, 0),
    ('Departure', '2010-05-04', 'Kiel', 1, 0),
    ('Arrival', '2010-05-05', 'Hamburg', 1, 0),
    ('Departure', '2010-05-06', 'Hamburg', 1, 0),
    ('Arrival', '2010-05-07', 'Amsterdam', 1, 0),
    ('Departure', '2010-05-07', 'Amsterdam', 1, 0),
    ('Departure', '2010-05-02', 'Odense', 2, 0),
    ('Arrival', '2010-05-03', 'Kiel', 2, 0),
    ('Departure', '2010-05-04', 'Kiel', 2, 0),
    ('Arrival', '2010-05-05', 'Hamburg', 2, 0),
    ('Departure', '2010-05-06', 'Hamburg', 2, 0),
    ('Arrival', '2010-05-07', 'Amsterdam', 2, 0),
    ('Departure', '2010-05-07', 'Amsterdam', 2, 30),
    ('Arrival', '2010-05-07', 'Porto', 2, 30),
    ('Departure', '2010-05-07', 'Porto', 2, 0)
;
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