Avatar billede fckmax Nybegynder
26. november 2009 - 11:55 Der er 5 kommentarer og
1 løsning

Where Clause problem

Hej alle

Jeg har et problem med en where clause, er ikke helt sikker på om man overhovedet kan få det resultat jeg ønsker, men jeg prøver at beskrive problemet her:
Jeg har en tabel med lokationer, som identificeres på ID. Så har jeg en tabel med attributter der ligeledes identificeres på ID.
Så har jeg en tabel hvor disse id'er er samlet.
Ex:
LokationAttributtabel
id lokationid attributid
1    1          5
2    1          8
3    2          5
4    3          8
5    4          7

På følgende where clause:
WHERE LokationAttributtabel.attributid = 5
får jeg selvfølgelig lokationerne med lokationid 1 og 2 ud.
Hvis jeg ændrer where clausen til
WHERE LokationAttributtabel.attributid = 5 AND LokationAttributtabel.attributid = 8 får jeg ingen resultater ud, hvor jeg troede at jeg kunne få lokationid 1 ud, da den har attributid 5 og 8. Det skal nemlig være muligt at vælge flere attributer, og så kun få lokationer ud der har alle de valgte attributid'er.
Jeg bruger MSSQL Server 2005 Management Studio.
På forhånd tak...
fckmax
Avatar billede Slettet bruger
26. november 2009 - 12:03 #1
WHERE LokationAttributtabel.attributid = 5 AND LokationAttributtabel.attributid = 8 giver vel kun de poster hvor lokationen er både 5 og 8 ?!
Avatar billede Slettet bruger
26. november 2009 - 12:03 #2
Skal du ikke bare have fat i en OR clause?
Avatar billede pi-hus Nybegynder
26. november 2009 - 12:46 #3
Problemet med din AND, er at de to attributid du vil finde ligger i hver sin post. Så når du sætter en AND imellem de to betingelser, så vil den aldrig give noget resultat (da hver post kun har een attributid).


Du kan gøre det med noget i den her retning:

-- Først finder du de poster i tabellen, hvor en af dem er fundet
SELECT LocationID
FROM LokationAttributtabel
WHERE attributid = 5 OR attributid = 8


-- Så vælger du de lokationer der har fået præcis 2 hits i udvælgelsen
SELECT LocationID, COUNT(*) AS hits
FROM LokationAttributtabel
WHERE attributid = 5 OR attributid = 8
GROUP BY LocationID
HAVING COUNT(*) = 2


Det vil jeg tro vil virke.  :)
Avatar billede arne_v Ekspert
26. november 2009 - 14:20 #4
self join:

SELECT lat1.lokationid
FROM LokationAttributtabel lat1 JOIN LokationAttributtabel lat2 ON lat1.lokationid=lat2.lokationid
WHERE lat1.attributid=5 AND lat2.attributid=8
Avatar billede pi-hus Nybegynder
26. november 2009 - 14:51 #5
Du har ret Arne - det er nok en hel del mere elegant at gøre det som dit forslag.
Avatar billede fckmax Nybegynder
26. november 2009 - 20:49 #6
pi-hus og arne_v: Tak for jeres svar, det var dejlig hurtigt og det hele ;)
Jeg vil forsøge mig frem med begge forslag - Endnu en gang mange tak.
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