Avatar billede gkn2000 Nybegynder
29. november 2001 - 14:29 Der er 22 kommentarer og
1 løsning

Flere værdier for en database

Hvordan laver man en søgning i en database hvor man har flere værdier f.eks. (1 og 2 og 3) og hvor man KUN for vist de records hvor disse 3 værdier optræder i?
Avatar billede eagleeye Praktikant
29. november 2001 - 14:31 #1
med WHERE og AND

strSQL = \"SELECT * FROM tabel WHERE felt1=1 AND felt2=2 AND felt3=3\"
Avatar billede darkhero Nybegynder
29. november 2001 - 14:32 #2
strSQL = \"SELECT * FROM tabel WHERE felt= %1% AND felt=%2% AND felt=%3%\"
Avatar billede eagleeye Praktikant
29. november 2001 - 14:34 #3
det lidt mere udvidet:

strSQL = \"SELECT * FROM tabel WHERE (felt1=1 OR felt1=2 OR felt1=3) AND (felt2=1 OR felt2=2 OR felt2=3) AND (felt3=1 OR felt3=2 OR felt3=3)\"

der kan bare bygges på.
Avatar billede darkhero Nybegynder
29. november 2001 - 14:36 #4
eagleeye >>> han skriver optræder i, så kan du ikke bare bruge =...

du skal huske at have % og % rundt om!
Avatar billede eagleeye Praktikant
29. november 2001 - 14:43 #5
\"optræder i\" betyder ikke nødvendigvis \"del af en kolonne (felt)\", det kan også bare være 1,2,3 optæder for sig selv i en kolonne. % % viker kun på Tekst-felter og så vist jeg husker også kun samme med LIKE.

strSQL = \"SELECT * FROM tabel WHERE felt LIKE \'%1%\' AND felt LIKE \'%2%\' AND felt LIKE \'%3%\';\" 
Avatar billede gkn2000 Nybegynder
29. november 2001 - 14:45 #6
Okay … jeg glemte hvis at sige at min database er relations database. Det vil sige at jeg har en tabel med mine enheder og en men de komponenter der kan være i en enhed. Der er så lavet en deltnøgle-tabel hvor de to tabellers prima -id er i og det er så meningen at jeg kun vil så de enheder der f.eks. har komponent 1 og 3 ikke dem men 1 og 2 og 3 KUN 1 og 3.
Avatar billede pierrehusted Nybegynder
29. november 2001 - 15:55 #7
Sådan f.eks.

Select * from enheder where enhedid in (select enhedid from deltnøgle-tabel where komponent = 1 or konponent = 3)

Avatar billede gkn2000 Nybegynder
29. november 2001 - 16:56 #8
Det virker heller ikke :-(
Avatar billede pierrehusted Nybegynder
29. november 2001 - 17:09 #9
Hvad virker ikke ??  Får du en fejlmeddelelse ??  Kommer der forkerte data ??  Kommer ikke alle data ??  Kommer der slet ingen data ??

Du er nødt til lige at kommentere det lidt mere.
Avatar billede pierrehusted Nybegynder
29. november 2001 - 17:10 #10
Eller lad os eventuelt se definitionerne på dine tabeller - det vil nok hjælpe lidt.
Avatar billede gkn2000 Nybegynder
29. november 2001 - 17:18 #11
Der kommer slet ingen data! her er IIS5.0 fejlmeddelelsen :
Fejltype:
Microsoft JET Database Engine (0x80040E14)
Der er en ugyldig SQL-sætning. \"DELETE\", \"INSERT\", \"PROCEDURE\",\"SELECT\" eller \"UPDATE\" var ventet.
visliste.asp, line 102

.... og linie 102 ser sådan ud:

objRS.Open strSQL, Conn

så der altså et eller andet galt, det er som om at asp ikke kan køre en \"IN(select)\" ting .. 
Avatar billede pierrehusted Nybegynder
29. november 2001 - 18:50 #12
ASP kan sagtens køre en In(Select...) - den sender den bare videre til databasen. Spørgsmålet er om databasen kan håndtere det.
Hvad for en database bruger du ??
Og hvordan har du præcis skrevet SQL sætningen ?
Avatar billede eagleeye Praktikant
29. november 2001 - 21:07 #13
Hvis jeg forstår dig rigtigt så har du dette:

enheder:
E_ID  Navn
1    Radio
2    TV

Kompunenter:
K_ID  Navn
1    Tuner
2    Billederør
3    Fjernbetjæning

Og sidste tabel (delt-nøgle tabel):
E_ID  K_ID
1      1
1      3
2      1
2      2
2      3

Så vil du havde en liste med E_ID hvor K_ID er 1 og 3 fra delt-nøgle tabel, men ikke hvis K_ID der er en K_ID mere (eks.vis 2).

Er det rigtigt forstået ??
Avatar billede gkn2000 Nybegynder
29. november 2001 - 22:35 #14
Det er 100% rigtigt...
Avatar billede pierrehusted Nybegynder
29. november 2001 - 22:45 #15
Måske sådan ...

select enheder.* from enheder, komp, delt
where enheder.E_ID = delt.E_ID
and  (delt.K_ID = 1 or delt.K_id = 3)
and  delt.K_ID <> 2

Avatar billede gkn2000 Nybegynder
29. november 2001 - 23:11 #16
Hvad gør den sidste delt.K_ID <> 2 ???
Avatar billede pierrehusted Nybegynder
29. november 2001 - 23:15 #17
Finder dem der er forskellige fra 2.

Du ville ikke have de poster med der har en post med 2 i komponent.
Avatar billede pierrehusted Nybegynder
29. november 2001 - 23:16 #18
Den er ikke nødvendig hvis du kun har de tre poster i komponenttabellen.
Men hvis du har flere poster i komponenttabellen, så skal den være der.
Avatar billede gkn2000 Nybegynder
29. november 2001 - 23:35 #19
det virker nu ikke ... jeg får E_ID 1 og 2 hvor E_ID har K_ID 1 og 2 men hvor E_ID 2 har K_ID 1.. og det jeg ville var jo kun at finde den E_ID hvor begge var i.
Avatar billede eagleeye Praktikant
30. november 2001 - 00:20 #20
Det er så vidt jeg kan ikke muligt med en let SQL sætning prøv denne:

SELECT enhed.navn FROM (enhed LEFT JOIN DNT ON enhed.E_ID = DNT.E_ID) LEFT JOIN komponent ON DNT.K_ID = komponent.K_ID WHERE DNT.K_ID IN (1,3) AND DNT.E_ID NOT IN (SELECT DNT.E_ID FROM DNT WHERE DNT.K_ID NOT IN (1,3));

Den giver godt nok X antal enhed.navn, faktisk lige så mange som der er tal du vil søge på (1,3). Problemmet er også at den ikke virker hvis du søger på (1,2,3) så giver den både radio og tv.!!
Avatar billede eagleeye Praktikant
30. november 2001 - 00:35 #21
Det med antalet kan løses med, DISTINCTROW:
SELECT DISTINCTROW enhed.navn
Avatar billede gkn2000 Nybegynder
30. november 2001 - 00:36 #22
Okay... det ser jo ikke ret godt ud er der ikke en måde man kan lave det hvis databasen laves om... er der nogen der har en ide´ til dette???
Avatar billede gkn2000 Nybegynder
30. november 2001 - 08:56 #23
Hvordan løser man problemet med at søger på (1,2,3)?????
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
Kurser inden for grundlæggende programmering

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