Avatar billede mn Nybegynder
18. november 2000 - 23:59 Der er 13 kommentarer og
1 løsning

Negationsresultater i sql...

Hejsa

Jeg har et problem med at få strikket en korrekt sql sammen.

Jeg har tre tabeller. De to første indeholder rå-data. Den sidste er en m:n relation.


Databasens definition :

[Medlem]:
mID - autonr
mNAVN - text

[Rolletype]:
rID - autonr
rNavn - text

[MedlemsRoller]:
mr_mID - integer
mr_rID - integer


Testdata for tabellerne kunne være følgende :

[Medlem]:
1
Morten
----
2
Povl

[Rolletype]:
1
Danser
----
2
Skuespiller
----
3
Instruktør

[MedlemsRoller]:
1
2
----
2
2
----
2
3


Det jeg skal bruge er to udtræk. Et der viser hvilke rolletyper ét medlem hhv har- og ikke har.

Den første er umiddelbart ret nem :
SQL = \"SELECT RolleType.rtID, RolleType.rtNavn FROM RolleType INNER JOIN MedlemsRolle ON RolleType.rtID = MedlemsRolle.mr_rtID WHERE MedlemsRolle.mr_mID=1;\"

Men den anden er sgu lidt problematisk. Jeg har rodet lidt med noget \"is null\" i where-clause\'n, men har ikke fået det til at spille.
Det nærmeste jeg er kommet - uden at det spiller er følgende :

SQL = \"SELECT RolleType.rtNavn FROM RolleType LEFT JOIN MedlemsRolle ON RolleType.rtID = MedlemsRolle.mr_rtID WHERE MedlemsRolle.mr_rtID Is Null AND MedlemsRolle.mr_mID=1;\"

Alternativt kunne jeg jo bare teste med en do-while løkke - det er piece of cake... men er ikke den løsning jeg spørger efter her.... Det må kunne lade sig gøre at trække den via SQL, ik ??

Eksperter - I er hermed hidkaldt. Der er point til den/dem der kan give mig det SQL-udtræk der viser hvilke RolleTyper ét specifikt medlem ikke har.  Hilfe !!

Mvh. Morten
Avatar billede sp Nybegynder
19. november 2000 - 00:25 #1
Hvis det er et felt der kan være true/false 0/1 så skal du skrive:
WHERE MedlemsRolle.mr_rtID=false AND MedlemsRolle.mr_mID=1;\"


SQL = \"SELECT RolleType.rtNavn FROM RolleType LEFT JOIN MedlemsRolle ON RolleType.rtID = MedlemsRolle.mr_rtID WHERE MedlemsRolle.mr_rtID =false AND MedlemsRolle.mr_mID=1;\"
Avatar billede sp Nybegynder
19. november 2000 - 00:26 #2
Eller hvis det bare indeholder et 0
WHERE MedlemsRolle.mr_rtID =0 AND MedlemsRolle.mr_mID=1;\"

Avatar billede mn Nybegynder
19. november 2000 - 00:30 #3
Der er jo tale om en m:n-relation. Dvs. hvis der ikke er et match, er der slet ikke noget post i relationstabellen - der er ikke noget der er lig 0 eller false....
Avatar billede sp Nybegynder
19. november 2000 - 00:35 #4
nååh nu tror jeg, jeg ved hvad du mener:
Du vil trække det ud som den valgte person ikke er medlem af.
Hvis den valgte person har ID=1 så kan du bruge:
<> som betyder \'ikke er\'

WHERE MedlemsRolle.mr_rtID <> 1;\"
Så skal du bare stryge den anden gang du skriver MedlemsRolle.mr_rtID

SQL = \"SELECT RolleType.rtNavn FROM RolleType LEFT JOIN MedlemsRolle ON RolleType.rtID = MedlemsRolle.mr_rtID WHERE MedlemsRolle.mr_rtID <>1;\"
Avatar billede mn Nybegynder
19. november 2000 - 00:53 #5
ok. Nu samler vi liige op. Det jeg vil have er en liste over hvilke rolletyper et medlem ikke er tilknyttet.

Ex:
Morten er \"skuespiller\".
Idet der findes tre rolletyper, nemlig danse, skuespiller og instruktør, kan det siges at Morten således ikke er \"danser\" og \"instruktør\"

Det jeg så skal bruge er et databaseudtræk hvori der står følgende

[Udtræk]:
1 (mID)
1 (rID)
Danser (rNavn)
----
1 (mID)
3 (rID)
Instruktør (rNavn)


Det er en lidt krypisk problemstilling. Håber jeg har gjort den tydelig nok.
Avatar billede sp Nybegynder
19. november 2000 - 12:51 #6
Som sagt, så trækker du det ud som Morten ikke er ved at lave en forespørgsel, med en select-sæltning. \"Select det som Morten ikke er\"
Som vist ovenfra.
Har du prøvet det?

RolleType.rtID=1
Og Morten har nummer 1, så vis der hvor der ikke står 1.

Avatar billede sp Nybegynder
19. november 2000 - 22:04 #7
Fuck dig. Du kunne i det mindste svare på om du har prøvet det???
Avatar billede mn Nybegynder
19. november 2000 - 22:23 #8
ok.
Essensen i denne problematik er den at jeg ved hvilket medlemsid (mID) der er. Det jeg vil udtrække er dermed en negation af de, til medlemmet associerede, rolletyper.

Således bliver resultatet en listning af rolletyper. Jeg kan altså ikke sætte rtID lig med noget i min forespørgsel. Det der endvidere er den egentlige del af problemstillingen er at jeg ønsker at joine tabeller der giver mig ikke-eksisterende tupler - data der ikke findes. Deri negationen.

Den måde jeg kunne forestille mig der kunne være en mulighed for at løse problemet er ved brug af nogle subsets.

Et tradtionel select-statement er næppe en løsning. Det ville naturligvis være en herlig lettelse hvis der pludseligt skulle være nogen der kunne præsentere en sådan for mig.... meeen... det ville undre mig lige så meget.

Jeg har lavet en testdatabase som ligger på nedenstående url. Den er i Access2000 format og er zippet. Hvis der er nogen der har lyst til at forsøge sig....

http://www.molle.subnet.dk/test.zip

Filen fylder ca. 20k.

Den indeholder de tre tabeller samt fire forespørgsler. De to af dem virker - de udtrækker hhv. Mortens og Povls roller. De øvrige to er tomme. Det er så meningen at de skal vise hhv. Mortens og Povls ikke-roller.

Morten : Danser og instruktør
Povl : Danser



Iøvrigt forhøjer jeg nu point-satsen til 250.

Mvh. Morten
Avatar billede mn Nybegynder
19. november 2000 - 22:27 #9
Ang. 22:04:12. Jeg var såmænd ved at skrive en længere tekst, gennemlæse den, oprette en testbase, få hul igennem til min subnetside, uploade, osv-osv-osv...

Så, stille rolig..... jeg er glad for din aktivitet. Håber vi finder ud af problemstillingen... Det kunne også være fedt hvis der var flere der joinede diskussionen... Flere hoveder er altid godt og dette er et udemærket forum !!

Morten
Avatar billede mobiludstyr.dk Nybegynder
19. november 2000 - 22:58 #10
Jeg følger nøje diverse indlæg vedr. ASP, PHP3 og SQL.
Jeg har lige læst jeres indlæg og har fået den vildeste griner over SP´s indlæg.

Tænk, at en Expert skriver \"FUCK DIG\", det er de færeste af mine udviklere der benytter dette ordvalg.

Jeg håber dog, at i finder et svar på jeres problemstilling.

Mvh

Jesper B. Jensen
CEO
Eurotronics Software Ukraine.
Avatar billede mn Nybegynder
19. november 2000 - 23:51 #11
Nu har jeg siddet og læst lidt om subqueries...
Jeg er kommet frem til følgende sql.

SELECT distinct RolleType.rtNavn
FROM RolleType,medlemsrolle Where not RolleType.rtID = (SELECT MedlemsRolle.mr_rtID from MedlemsRolle where mr_mID=1);

hhv. tilføjes/fjernes \"not\" for at se udtrækket og dettes negation...

Den virker fint - sålænge der kun er tale om én rolle per medlem. Det var lidt meningen at et medlem skulle kunne besidde flere rolletyper...

Hmmm... håber på noget ekspert-hjælp

Mvh Morten
Avatar billede mn Nybegynder
20. november 2000 - 00:35 #12
Efter længere tids søgen har jeg faktisk fundet løsningen !!!!

Juuubiiiiiiiii !!!! hurraaaaaa ! :) :)

Der skulle simpelthen bare en subquery til. Så let var det :

SELECT RolleType.rtNavn, RolleType.rtID
FROM RolleType
WHERE (((RolleType.rtID) Not In (SELECT mr_rtID FROM MedlemsRolle WHERE mr_mID = 1)));

Jeg napper selv pointene - det var trods alt mig selv der gav svaret... måske spurgte jeg lidt for tidligt... håber ikke nogen har brugt for lang tid på det... Ellers finder vi ud af noget med nogle points...

Mvh. Morten
Avatar billede sp Nybegynder
20. november 2000 - 12:41 #13
>Jeg følger nøje diverse indlæg vedr. ASP, PHP3 >og SQL.
>Jeg har lige læst jeres indlæg og har fået den >vildeste griner over SP´s indlæg.

Jeg følger diverse indlæg i ASP.
Jeg har lige læst jeres indlæg og grint over at en fra mobiludstyr.dk ikke fatter en skid!

>Tænk, at en Expert skriver \"FUCK DIG\", det er de >færeste af mine udviklere der benytter dette >ordvalg.

Tænk at nogle pisser på folk der tilbyder deres ekspertise.

>Jeg håber dog, at i finder et svar på jeres >problemstilling.

Han har jo selv fundet den. Han kan bare ikke finde uad af at give lyd fra sig.

Mvh
Jesper B. Jensen

Med uvenlig hilsen
Søren
Avatar billede mn Nybegynder
20. november 2000 - 13:43 #14
Hvorfor dog denne uvenlige tone. Det er da totalt stenet.
Årsagen til dit indlæg kl. 22:04:12 - der startede denne mudderkastningsseance - må være at jeg afviste dit svar, før end jeg kom med en videre præcisering af problemstillingen som du kan se v. kl. 22:23:49. Derefter følger en (synes jeg) forklarende kommentar der burde opløse dette problem.

Lad os nu lukke denne diskussion.

Søren, hvis du vil have point må du give mig en bedre løsning end den jeg har fundet. Det bør kunne lade sig gøre. Min løsning er ikke specielt effektiv, idet den reelt foretager to forespørgsler og finder differencen imellem disse. Altså 2 steps...


Mvh. Morten Nielsen
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