27. august 2002 - 16:56Der er
5 kommentarer og 1 løsning
Udtræk af Data
Hej
Jeg har et problem omkring udtræk af data fra en database som er følgende.
Jeg har en tabel (document) med følgende indhold : ----------------------------------- ID - som er unik refID - en reference id, til et reference objekt date - dato som dokumentet er oprettet doctype - typen på dokumentet -----------------------------------
Hvis man ser overordnet på det har jeg et reference objekt som kan indeholde en eller flere dokumenter, som hver har sin specielle type. Fx. kan en reference indeholde et ordre dokument, og et kviterings dokument. Disse ligger så at sige grupperet via deres refID som naturligvis er den samme, når de tilhører den samme reference.
Nu ønsker jeg at lave en select sætning der giver mig alle de reference ID'er som indeholder et dokument fx. en ordre, men ikke et andet fx. en kvitering. Dvs. jeg vil se om en reference har en ordre men ikke har en kvitering, og dermed udtrække reference ID på dem som ikke indeholder kviteringen.
For at pensle det endnu mere ud. Hvis jeg har 10 referencer, hvor alle 10 på nær nummer 5 kun indeholder et dokument af typen ordre, og nummer fem både indeholder en ordre og en kvitering. Så ønsker jeg at hive reference ID ud på alle nær nummer 5. Hvis fx. reference nummer 11 indeholder noget andet end en ordre, skal der heller ikke tjekkes på den.
Håber i kan forstå problemet, og endnu bedre give mig en løsning eller et hint til hvordan det muligvis kan løses. Det skal siges at det skal laves i så generel SQL som muligt, så ingen specifikke MySQL eller andre funktioner.
Prøv denne SQL, den er så standard som sådan noget kan være:
Hvis tabellen hedder Document, og doctype indeholder "ORD" eller "KVI"
SELECT Document.ID, Document.refID, Document.docType FROM Document WHERE Document.docType="ORD" and Document.ID Not In (SELECT ID from Document where docType="KVI")
Du fik en generel løsning, som du specifikt bad om. Du frabad dig netop MySQL's kringlekroge. Nå, men subselect bliver implementeret i version 4.1, og indtil dette sker kan du bruge en temporær tabel, hvor du lagrer resultatet fra subselecten, hvorefter du kan fikse dit spørgsmål via en join.
INSERT INTO DocumentTemp (ID) SELECT Document.ID FROM Document WHERE Document.ID = "KVI"
og din join laver du sådan:
SELECT Document.ID, Document.refID, Document.docType FROM Document LEFT JOIN DocumentTemp ON Document.ID = DocumentTemp.ID WHERE Document.docType="ORD" and DocumentTemp.ID is null
Måden at gøre det på var rigtig, men der skulle lidt tilpasning til. Sådan blev resultatet :
INSERT INTO temp_doc SELECT * from Document where doctype = "receipt";
INSERT INTO temp_doc_found SELECT document.* FROM document LEFT JOIN temp_doc ON document.refID = temp_doc.refID WHERE document.doctype="order" AND temp_doc.refID is null;
Tak for hjælpen
/Morten
Synes godt om
Ny brugerNybegynder
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.