Du må være registrert og logget inn for å kunne legge ut innlegg på freak.no
X
LOGG INN
... eller du kan registrere deg nå
Dette nettstedet er avhengig av annonseinntekter for å holde driften og videre utvikling igang. Vi liker ikke reklame heller, men alternativene er ikke mange. Vær snill å vurder å slå av annonseblokkering, eller å abonnere på en reklamefri utgave av nettstedet.
  18 1036
Hei,

Om jeg har en tabell som er slik.

| indeks | verdi |
1 ...
2 klausemann
2 ole
2 jens
3 ole
3 jens
4 ...

Så ønsker jeg å gjøre en spørring som ser på verdien jens og ole, og da returnerer antallet. Men om det finnes mer enn de to verdiene (som klausemann i indeks 2), vil den ikke returnere indeksen.

Spørringen ser jeg blir noe à la dette:

Kode

SELECT COUNT(indeks) FROM tabell
WHERE verdi = 'jens' AND  verdi = 'ole' AND NOT (verdier).
og skal returnere COUNT(indeks) = 1 (fra indeks 3).

Problemet er at

Kode

verdi = 'jens' AND  verdi = 'ole'
returnerer 0 rader siden en rad kun har en verdi (og kan ikke ha begge verdiene). Så derfor må jeg kjøre en group by? Hvordan blir denne (om det er tilfellet)?
verdi = 'jens' OR verdi = 'ole'

Eller har jeg misoppfattet noe?
esl
twist?
esl's Avatar
Trådstarter
Da får du med indeks 2 som inneholder klausemann, så det går ikke.
Da har jeg misopfattet noe.

verdi = 'jens' OR verdi = 'ole'

vil aldri gi true på klausemann, kun på jens eller ole.
esl
twist?
esl's Avatar
Trådstarter
Skriver man verdi = 'jens' OR verdi = 'ole', vil også indeksnummer der klausemann er med, bli med. Om du leser vil jeg jo ikke det.
Sist endret av esl; 6. mars 2012 kl. 16:49.
Hvordan mener du at raden med klausemann blir med i sjekken til både Jannis og raze har nevnt?
Den vil returnere radene hvor verdi er jens eller ole. Ikke noe klausemann der.
Jeg har ikke brukt SQL på en stund så jeg er litt usikker på syntaksen:

Kode

SELECT COUNT(*) FROM (
 (SELECT indeks FROM tabell
  where verdi = 'Jens' OR verdi = 'Ole')
NOT IN
 (SELECT indeks FROM tabell
  where verdi != 'Jens' AND verdi != 'Ole'))
EDIT: Var litt for rask første gangen
Sist endret av Akinakes; 6. mars 2012 kl. 16:56.
esl
twist?
esl's Avatar
Trådstarter
Sitat av Sjanten Vis innlegg
Hvordan mener du at raden med klausemann blir med i sjekken til både Jannis og raze har nevnt?
Den vil returnere radene hvor verdi er jens eller ole. Ikke noe klausemann der.
Vis hele sitatet...
Snakker ikke om raden, men om verdien på indeksnummeret (som er 2).
Sitat av esl Vis innlegg
Snakker ikke om raden, men om verdien på indeksnummeret (som er 2).
Vis hele sitatet...
Da bør du vel ikke bruke Count().

Edit: Jeg sliter faktisk litt med å forstå hva du vil oppnå, og hvorfor strukturen på databasen din har indekser OG verdier som har duplikater.
Sist endret av Dyret; 6. mars 2012 kl. 16:58.
Tror du må ha med DISTINCT også forresten.

Kode

SELECT COUNT(*) FROM (
 (SELECT DISTINCT indeks FROM tabell
  where verdi = 'Jens' OR verdi = 'Ole')
NOT IN
 (SELECT DISTINCT indeks FROM tabell
  where verdi != 'Jens' AND verdi != 'Ole'))
esl
twist?
esl's Avatar
Trådstarter
Fant to løsninger, den første har kjørt i 1,5 time (massive datamengder), men tror den er rett. Den andre ble kjørt på 5 sekunder.

Treg:

Kode

SELECT indeks FROM tabell 
WHERE 
indeks NOT IN( SELECT indeks FROM tabell WHERE verdi <> 'ole' AND verdi <> 'jens')
GROUP BY indeks
HAVING COUNT(verdi) = 2

Rask:

Kode

SELECT indeks FROM tabell s WHERE
verdi IN ('jens', 'ole')
AND
NOT EXISTS (SELECT DISTINCT k.indeks FROM tabell k
  WHERE k.verdi != 'jens' AND k.verdi != 'ole' AND k.indeks = s.indeks )
GROUP BY s.indeks
HAVING COUNT(*) = 2;
Hvis jeg ikke tar feil så blir det første det samme som å skrive:

Kode

SELECT indeks FROM tabell 
WHERE verdi = 'ole' OR verdi = 'jens')
GROUP BY indeks
HAVING COUNT(verdi) = 2
Regner med at dette går litt raskere.
esl
twist?
esl's Avatar
Trådstarter
Nei, du får fortsatt med indeksnummeret til klausemann :-)
Sikkerhetsklarert
Sitat av Dyret Vis innlegg
Da bør du vel ikke bruke Count().

Edit: Jeg sliter faktisk litt med å forstå hva du vil oppnå, og hvorfor strukturen på databasen din har indekser OG verdier som har duplikater.
Vis hele sitatet...
Jeg er enig med du. Her er det noe som ikke stemmer ift normalisering

Forstår du har forenklet kolonnenavn og innhold for eksemplet sin del. Men jeg tror det vil være enklere å hjelpe deg om vi får vite hva indeks og verdi representerer, og hva du ønsker å finne med queryen din.
esl
twist?
esl's Avatar
Trådstarter
Alt stemmer etter normalisering, men ser det blir vanskelig å tyde når kolonnenavn er fjernet. Dette er jo en mange-til-mange tabell, så ser ikke hva dere mener ikke er normalisert her.
Indeks kan jo være bilnummer, mens verdi kan være tilleggsutstyr. Så kan vi jo si at jeg skulle finne biler som har GPS og soltak, men ikke noe annet.
Sist endret av esl; 6. mars 2012 kl. 17:55.
Sikkerhetsklarert
Sitat av esl Vis innlegg
Alt stemmer etter normalisering, men ser det blir vanskelig å tyde når kolonnenavn er fjernet. Dette er jo en mange-til-mange tabell, så ser ikke hva dere mener ikke er normalisert her.
Indeks kan jo være bilnummer, mens verdi kan være tilleggsutstyr. Så kan vi jo si at jeg skulle finne biler som har GPS og soltak, men ikke noe annet.
Vis hele sitatet...

Om vi skal følge den analogien da, så vil eksemplene ovenfor fungere.
De vil jo kun returnere de radene der verdien er f.eks GPS og soltak, men om hver bil har en rad for hvert ektrautstyr som er registrert på den så vil du som du skriver, også få med indeks for de biler som også har annet utstyr i tillegg.

Jeg er ingen ekspert i dette, men i lignende prosjekter jeg har vært med på har vi strukturert databasene slik at hver enkel verdi er en egen kollonne og da vil du kun registrere èn rad per bil. og ha true/false på verdi-radene.
Sist endret av Pjukern; 6. mars 2012 kl. 18:07.
Nei, du får fortsatt med indeksnummeret til klausemann :-)
Vis hele sitatet...
Ja, selvfølgelig ! Tror begge løsningene dine er riktig, men prøv:

Kode

CREATE VIEW andre AS
  (SELECT DISTINCT indeks FROM tabell 
   WHERE verdi <> 'ole' AND verdi <> 'jens')

SELECT indeks FROM tabell 
WHERE indeks NOT IN andre
GROUP BY indeks
HAVING COUNT(verdi) = 2

DROP VIEW andre
Så slipper du å lage den midlertidige tabellen for hver linje.

Hvis det er nok at enten ole eller jens er med (dvs. du trenger ikke begge) så kan du droppe GROUP BY og legge til DISTINCT istedenfor
esl
twist?
esl's Avatar
Trådstarter
Sitat av Pjukern Vis innlegg
Om vi skal følge den analogien da, så vil eksemplene ovenfor fungere.
De vil jo kun returnere de radene der verdien er f.eks GPS og soltak, men om hver bil har en rad for hvert ektrautstyr som er registrert på den så vil du som du skriver, også få med indeks for de biler som også har annet utstyr i tillegg.
Vis hele sitatet...
Om en bil har tilleggsutstyret GPS, soltak og motorvarmer, og du kun leter etter biler med GPS og soltak, så sier jo seg selv at spørringen blir å sjekke GPS og soltak, og så fjerne bilen om den har andre tilleggsutstyr.

Jeg er ingen ekspert i dette, men i lignende prosjekter jeg har vært med på har vi strukturert databasene slik at hver enkel verdi er en egen kollonne og da vil du kun registrere èn rad per bil. og ha true/false på verdi-radene.
Vis hele sitatet...
Mye registrering av overfløding informasjon altså Hva gjør du om det kommer nytt tilleggsutstyr?

Takk Akinakes for input
Sist endret av esl; 6. mars 2012 kl. 18:27.
Sikkerhetsklarert
Sitat av esl Vis innlegg
Om en bil har tilleggsutstyret GPS, soltak og motorvarmer, og du kun leter etter biler med GPS og soltak, så sier jo seg selv at spørringen blir å sjekke GPS og soltak, og så fjerne bilen om den har andre tilleggsutstyr.
Vis hele sitatet...
Jepp, og da er det vel egentlig i mål? Ift hva du spurte om i første post?

Mye registrering av overfløding informasjon altså Hva gjør du om det kommer nytt tilleggsutstyr?
[/quote]

Ja er det nok, men datamengden vil nok ikke være så mye større totaltsett.
En rad med f.eks 30 kollonner (verdier). Ift to å registrere 30 rader med to kolonner (identifier og verdi)

I dette tilfellet så var det snakk om printere, og vi hadde på forhånd definert hva vi ville vite om hver enkelt maskin. Så dette var "hardkodet" både i database og i logikken som presenterte dataene.