Avatar billede anhansen Nybegynder
10. oktober 2004 - 13:12 Der er 16 kommentarer og
1 løsning

Kan man ikke lave in NOT IN mængde?

Hej,

Et hurtig sql spørgsmål.
Jeg er ved at lave et udtræk hvor jeg har en tabel med kunder og en med ordrer. Jeg kan sagtens lave et udtræk hvor jeg får alle de kunder ud der har en ordre. Altså:
SELECT * FROM tblKunde WHERE kundeId IN (SELECT kundeID FROM tblOrdre WHERE status = 1)
Hvor status =1 betyder at det er en ordre.
Men jeg kan ikke trække noget ud hvis jeg gerne vil have alle de kunder der IKKE har en ordre. Altså noget lignende.
SELECT * FROM tblKunde WHERE kundeId NOT IN (SELECT kundeID FROM tblOrdre WHERE status = 1)

Altså hvor jeg søger igennem og hvis kundens id ikke er blandt dem der har tegnet ordre - så skal den med i udtrækket.

Kan det ikke lade sig gøre? Ovenstående (nr 2) returnerer ingen resultater, og jeg ved tilfældigvis at det ikke er alle kunder der har tegnet ordrer.. :-)
Avatar billede Syska Mester
10. oktober 2004 - 13:32 #1
Du skal bruge LEFT OUTER JOIN
Noget ala det her:
"SELECT p.pollId, p.pollQuestion, SUM(po.pollOptionVotes) AS votes, COUNT(po.pollId) AS options FROM poll as p LEFT OUTER JOIN pollOption AS po ON p.pollId = po.pollId GROUP BY p.pollId"
altså må dit blive uden at have testet det:
SELECT t1.*, t2.kundeId  FROM tblKunde as t1 LEFT OUTER JOIN tblOrdre AS t2 ON t1.kundeId = t2.kundeId
Avatar billede Syska Mester
10. oktober 2004 - 13:33 #2
Det øverste er en af mine hvor jeg bruger den :-)
Avatar billede Syska Mester
10. oktober 2004 - 13:35 #3
okay, Datalogi :-) lyder cool nok, ville gerne snakke med en som har læst det da jeg ikke helt ved hvad man laver det etc. og om det er noget for mig, men du kan jo smide en mail eller added mig på mikael@syska.dk

// ouT
Avatar billede anhansen Nybegynder
10. oktober 2004 - 13:43 #4
Problemet er at der findes ordrer som er af en anden status, f.eks tilbud eller annuleret.
I din ville jeg desuden få alle dem som havde odrer.. Ville jeg ikke? Jeg skal finde alle dem som ikke er ordrer?

Men skriv gerne tilbage - jeg tager hjem nu - men svarer igen i morgen tidlig.. :-)

Go' resterende weekend.. :-)
Avatar billede Slettet bruger
10. oktober 2004 - 14:17 #5
Prøv dette.
SELECT * FROM tblKunde WHERE not exists (SELECT kundeID FROM tblOrdre WHERE status = 1 and tblkunde.kundeid=tblordre.kundeid)
Avatar billede Syska Mester
10. oktober 2004 - 16:31 #6
FFS, hader exp, hvorfor kom mit andet indlæg ikke frem :-(

SELECT p.pollId FROM poll AS p LEFT OUTER JOIN pollOption AS po ON p.pollId = po.pollId GROUP BY p.pollId HAVING COUNT(po.pollId) = 0

Virker 100%, og kan nemt srkives om til din table

Men du kan jo lige prøve i morgen igen, og så vende tilbage....

// ouT
Avatar billede arne_v Ekspert
11. oktober 2004 - 09:36 #7
Mystisk - umiddelbart synes jeg nemlig at din query burde virke !!
Avatar billede anhansen Nybegynder
11. oktober 2004 - 10:09 #8
arne-> Er det til min eller en af de andres? Jeg synes også den burde virke - men får altså ingen resultater ud. Jeg har nu lavet 2 queries. En der trækker den første ud, og en der trækker NOT IN klausulen ud.
Og så har jeg et lille c# program der lavet "NOT IN" på den vha alm. løkke cirkus.

Men jeg forstår ikke hvorfor den ikke kan det andet?
Avatar billede arne_v Ekspert
11. oktober 2004 - 10:16 #9
din
Avatar billede anhansen Nybegynder
11. oktober 2004 - 10:28 #10
Så har jeg nok bare lavet en eller anden fodfejl - nu har jeg også forsimplet den lidt da der er lidt flere krav på den rigtige.
Men ideen er den samme, og udtrækkene virker hver for sig.
Jeg kan lige prøve at poste den oprindelige:
SELECT distinct f.firmaId, f.navn, g.navn
FROM crm.dbo.tblFirmaer AS f
INNER JOIN crm.dbo.tblfirma_grupper AS fg ON fg.firmaId = f.firmaId
INNER JOIN crm.dbo.tblGrupper AS g ON fg.gruppeId = g.gruppeId
WHERE
fg.gruppeId IN (SELECT gruppeID from crm.dbo.tblgrupper WHERE gruppeid = 96 OR gruppeID = 97)
AND
fg.firmaId NOT IN (SELECT distinct company_crmref FROM dds.dbo.tblOrders
WHERE
status = 4
AND created > '10-08-2003'
AND deleted IS NULL
AND confirmed = 1
)
AND fg.slettet IS NULL
AND f.slettet IS NULL
ORDER BY g.navn

Kan i se fejlen? Hvis jeg ændrer NOT IN til IN i udtrækket får jeg korrekt alle de kunder der har lagt ordrer.
Avatar billede anhansen Nybegynder
15. oktober 2004 - 12:27 #11
Åbenbart ikke.. ;-)

Jeg lukker..
Avatar billede anhansen Nybegynder
15. oktober 2004 - 12:30 #12
Buzz-> du kan finde en del information om Datalogi på www.cs.auc.dk der er en del information om uddannelsen.
Bland andet semestersider, indhold i studiet osv..
Der er nok også links til folk der render rundt ude på uni..

Jeg har kun taget bachelor som overbygning til datamatiker - så jeg er nok ikke den rette til at forklare hvordan det er fra starten, og hvad de lærer som man ikke lærer som datamatiker... For det var ikke alle der havde lært voldsomt meget mere end os da vi kom ind idet.. :-)
Avatar billede Syska Mester
15. oktober 2004 - 13:02 #13
hmmm, hvor lang tid har den så taget, altså når du siger det er en overbygning?
en bachelor tager vist nok 3 år, og en kandidat 2 år mere end bachelor mener jeg, men jeg kan selvf tage fejl.
Avatar billede Syska Mester
15. oktober 2004 - 13:04 #14
Hvad er det du stadig ikke kan, er ikke helt med længere?
Avatar billede anhansen Nybegynder
15. oktober 2004 - 13:04 #15
det er korrekt.. Men jeg fik merit for min datamatiker, så jeg var på uni fra maj på et 3 mdrs intro halløj , og så to semestre.. Så var jeg bachelor.

Og kan så blive kandidat ved at tage to år mere... Men det skal jeg ikke lige nu.. :-)
Avatar billede arne_v Ekspert
15. oktober 2004 - 13:07 #16
Og for en god ordens skyld: det er ikke fordi vi ikke vil svare på spørgsmålet, men
jeg har ikke den fjerneste anelse om hvad problemet er. Den NOT IN burde virke
efter min bedste overbevisning.
Avatar billede anhansen Nybegynder
15. oktober 2004 - 13:20 #17
ja... det troede jeg også den ville...

Men jeg kan altså ikke lige gennemskue hvor jeg har lavet fejlen.. For et eller andet må der jo være galt.. Men som sagt.. Det blev løst ved at lave not in'en i c# istedet.. Så det må gå den her gang.. Så prøver jeg igen næste gang og ser om ikke det kan lykkedes der... :-)
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