Avatar billede golyf Nybegynder
09. oktober 2006 - 11:40 Der er 3 kommentarer og
1 løsning

Hjælp til select statement

Jeg har en statement:

select TabelB.objectid
from TabelB, TabelF, TabelS
where TabelB.kompunderfeltobjektid = TabelF.objectid
and  TabelB.KNUDEKLASSENAVN = 'Data'
and  TabelB.kompunderknudeobjektid = TabelS.objectid

Den giver ca. 2000 værdier tilbage, men jeg er egentlig mere interesseret i hvilke værdier af TabelB, som ikke opfylder kravet i sidste linie, men hvis jeg skriver:

select TabelB.objectid
from TabelB, TabelF, TabelS
where TabelB.kompunderfeltobjektid = TabelF.objectid
and  TabelB.KNUDEKLASSENAVN = 'Data'
and  TabelB.kompunderknudeobjektid != TabelS.objectid

får jeg 145.011.432.321 retur.

Er det mulig at lave en forspørgsel på formen:

Select *
from TabelB
where TabelB.ObjectID is not in(select TabelB.objectid
from TabelB, TabelF, TabelS
where TabelB.kompunderfeltobjektid = TabelF.objectid
and  TabelB.KNUDEKLASSENAVN = 'Data'
and  TabelB.kompunderknudeobjektid = TabelS.objectid)
Avatar billede arne_v Ekspert
09. oktober 2006 - 15:17 #1
virker den ikke ?
Avatar billede pierrehusted Nybegynder
09. oktober 2006 - 16:11 #2
Den første kan også skrives sådan her (efter min mening lidt mere overskueligt):

SELECT TabelB.objectid
FROM TabelB
JOIN TabelF ON TabelB.kompunderfeltobjektid = TabelF.objectid
JOIN TabelS ON TabelB.kompunderknudeobjektid = TabelS.objectid
WHERE TabelB.KNUDEKLASSENAVN = 'Data'


Hvis du gerne vil vide hvilke poster i TabelB JOINet med TabelF, som ikke findes i TabelS, så vil jeg tro det kan gøres sådan her:

SELECT TabelB.objectid
FROM TabelB
JOIN TabelF ON TabelB.kompunderfeltobjektid = TabelF.objectid
WHERE TabelB.KNUDEKLASSENAVN = 'Data'
AND TabelB.kompunderknudeobjektid NOT IN (SELECT TabelS.objectid FROM TabelS)
Avatar billede kjulius Novice
10. oktober 2006 - 00:50 #3
Mon ikke du kan bruge en ganske alm. LEFT JOIN?

SELECT TabelB.*
FROM TabelB
INNER JOIN TabelF ON TabelB.kompunderfeltobjektid = TabelF.objectid
LEFT OUTER JOIN TabelS ON TabelB.kompunderknudeobjektid = TabelS.objectid
WHERE TabelB.KNUDEKLASSENAVN = 'Data'
  AND TabelS.objectid IS NULL

Ved at filtrere på konditionen TabelS.objectid IS NULL pilles de rækker fra, hvor der ikke findes en relation til TabelS.

Jeg vil dog også tro, at den løsning pierrehusted kom med vil virke. Men jeg er altid lidt tilbageholdende med at bruge en subselect, hvis det kan undgås. Brugen af dem plejer ikke ligefrem at øge hastigheden.
Avatar billede pierrehusted Nybegynder
11. oktober 2006 - 08:52 #4
Jeg overvejede også en LEFT JOIN. Men en eller anden detalje i først indlæg (kan ikke huske hvad) fik mig til at skifte mening.
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