Problemer med SELECT sætning

Tags:    databaser

Jeg skriver ang. en SELECT sætning, som jeg ikke kan greje hvordan skal se ud.

Sætningen er egentlig møntet på at blive anvendt i en SQL server database, men for overskuelighedens skyld, har jeg dannet problemstillingen i Access også (databasen kan downloades – jf. link i bunden).

Følgende tabeller eksisterer:

Varetabel (indeholder en liste over alle varer)
ID (primærnøgle, anvendes ikke)
Varenr (varenummer - type: Number)
Aktiv (1 = aktiv vare, 0 = ikke aktiv vare - type: Number)

VarerPrBilagTabel (indeholder tilvalgte varer på et bilag)
ID (primærnøgle, anvendes ikke)
Varenr (varenummer - type: Number)
Bilagsnr (Et bilagsnummer optræder flere gange med forskellige varenumre - type: Number)

Nedenstående regler skal gælde – illustreres i trin herunder:

1. Vise alle aktive varer fra Varetabel. Dette udføres naturligvis simpelt ved denne SELECT sætning:

SELECT Varetabel.varenr, Varetabel.aktiv
FROM Varetabel
WHERE Varetabel.aktiv=1

2. Vise inaktive varer (dvs. varer hvor aktiv er sat til 0), men hvor varen er listet i tabellen VarerPrBilagTabel. Dette klares også let med en lille udbygning af SELECT sætning. Dog bliver det ikke til den endelige og dermed heller ikke den korrekte SELECT sætning:

SELECT Varetabel.varenr, Varetabel.aktiv
FROM Varetabel LEFT JOIN VarerPrBilagTabel ON Varetabel.varenr = VarerPrBilagTabel.varenr
WHERE Varetabel.aktiv=1 OR (Varetabel.varenr=VarerPrBilagTabel.varenr)

3. Vise ovenstående for et specifikt bilagsnr. fra VarerPrBilagTabel (efter dette er SELECT sætningen færdig og korrekt).

Her opstår problemet. Jeg kan ikke greje hvorledes jeg får puttet ind, at der kun skal kigges på varenumre i VarerPrBilagTabel hvor bilagsnr = f.eks. 10. Denne tabel indeholder jo ”mange” bilagsnumre, hvor de samme varenumre kan være listet flere gange for forskellige bilag.

For nemhedens skyld har jeg lagt denne forsimplede database op på følgende URL:

http://www.guldholdet.com/Varedatabase.mdb


Forespørgslen er også dannet i databasen (VarerFinal)

Spørg løs, hvis I har spørgsmål.

På forhånd tak




Indlæg senest redigeret d. 05.01.2008 01:51 af Bruger #13050
6 svar postet i denne tråd vises herunder
1 indlæg har modtaget i alt 4 karma
Sorter efter stemmer Sorter efter dato
Dette burde kunne hjælpe dig lidt på vej:

SELECT Varetabel.varenr, Varetabel.aktiv
FROM Varetabel
WHERE Varetabel.varenr IN (SELECT VarePrBilagTabel.varenr FROM VarePrBilagTabel WHERE VarePrBilagTabel.bilagsnr = 10)

Det giver dig samtlige varer der er tilknyttet et enkelt bilag.

Spyttede den lige ind, ved ikke om den sidder rigtigt. :)

SELECT Varetabel.varenr, Varetabel.aktiv
FROM Varetabel
LEFT JOIN VarerPrBilagTabel ON Varetabel.varenr = VarerPrBilagTabel.varenr
WHERE (Varetabel.aktiv=1 OR (Varetabel.varenr=VarerPrBilagTabel.varenr))
AND Varetabel.varenr IN (SELECT VarePrBilagTabel.varenr FROM VarePrBilagTabel WHERE VarePrBilagTabel.bilagsnr = 10)



Indlæg senest redigeret d. 05.01.2008 01:16 af Bruger #10216
Hej Gnu

Tak for hurtig respons.

Jeg tror du er inde på noget af det rigtige, men jeg kan dog ikke rigtig få det til at fungere.

Tanken med at lave en underforspørgsel burde dog kunne gøre det.

Jeg har i Access dannet en ekstra "hjælpe" forespørgsel til at udføre opgaven, og med denne virker det.

Jeg har kaldt hjælpeforspørgslen for VarerBilag og den "korrekte" forespørgsel for VarerDelvistKorrekt.

Jeg har uploadet en ny db til

http://guldholdet.com/Varedatabase2.mdb


Kan du greje løsningen herfra?

På forhånd tak



Indlæg senest redigeret d. 05.01.2008 02:06 af Bruger #13050
SELECT Varetabel.varenr, Varetabel.aktiv,VarerPrBilagTabel.*
FROM Varetabel
LEFT JOIN VarerPrBilagTabel ON Varetabel.varenr = VarerPrBilagTabel.varenr
WHERE (Varetabel.aktiv=1 OR (Varetabel.varenr=VarerPrBilagTabel.varenr))
AND VarerPrBilagTabel.bilagsnr = 10



Hej Gnu

Desværre medtager denne forespørgel kun varer, hvor bilagsnr = 10. De varer som derudover er aktive (aktiv = 1), skal også medtages.



Fold kodeboks ind/udKode 


Skal du have varerne listet kun én gang i resultatet, så må du ofre bilagsnr. og tilføje "GROUP BY varenr" eller lave en CONCAT på de værdier.



Indlæg senest redigeret d. 05.01.2008 22:08 af Bruger #10216
Hej Gnu

Jeg fandt selv denne simple løsning på problemet:

SELECT Varetabel.varenr, Varetabel.aktiv
FROM Varetabel
WHERE Varetabel.aktiv=1 OR Varetabel.varenr IN (SELECT VarerPrBilagTabel.varenr FROM VarerPrBilagTabel WHERE VarerPrBilagTabel.bilagsnr=10);

Denne lister alle aktive varer + varer vist i VarerPrBilagTabel, hvor bilagsnr er 10. Dette er netop det, som var ønsket.

Beklager hvis jeg ikke har formuleret mig klart nok.

Tak for din indsats.



t