Vinnaren i pepparkakshustävlingen!
  • 1
  • 2
2010-08-01, 11:40
  #1
Medlem
Jag har en select sats som tar fram ett par svar. Jag vill sedan ta reda på vilka som uppfyller samtliga svar, men använder jag tex IN får jag bara reda på om nån uppfyller nåt av svaren.
Citera
2010-08-01, 12:01
  #2
Medlem
Visa SQL-koden här tack
Citera
2010-08-01, 12:04
  #3
Medlem
kh31d4rs avatar
DBMS kan vara bra att veta också.
Citera
2010-08-01, 12:22
  #4
Medlem
använder access (2003/2007)

om jag exempelvis vill ha fram en person som äger alla saker som är röda:

Kod:
SELECT DISTINCT namn
FROM Person, Ägarregister
WHERE Person.personId=Ägarregister.personId
AND Ägarregister.sakId IN(SELECT DISTINCT Sak.sakId
FROM Sak, Typ
WHERE Sak.typId = Typ.typId
AND Typ.färg=röd);
Citera
2010-08-01, 12:27
  #5
Medlem
Citat:
Ursprungligen postat av fuzzalicious
använder access (2003/2007)

om jag exempelvis vill ha fram en person som äger alla saker som är röda:

I din fråga hittar du alla personer som äger minst en röd sak.

Menar du att hitta personer vars samtliga saker är röda?
Citera
2010-08-01, 12:31
  #6
Medlem
ja exakt, de kan även äga andra saker, men äger minst samtliga saker som är röda
Citera
2010-08-01, 13:51
  #7
Medlem
Det känns ju som något lätt, IN använder ju OR, skulle behöva ett IN ALL,
eller har skaparna av SQL inte tänkt på det
Citera
2010-08-01, 15:56
  #8
Medlem
dethalvabarnets avatar
Gissning utan att testat själv något men, sätt NOT före IN och NOT före Typ.färg=röd.
Citera
2010-08-01, 16:43
  #9
Medlem
Nix, får fram folk som äger röda saker, men några saknas, och det är inte dem som äger alla röda saker.
Citera
2010-08-01, 23:06
  #10
Medlem
dethalvabarnets avatar
hittar ingen fin lösning, men du kan alltid göra en cursorloop och kolla antal träffar gentemot max i cursorloopen på en select sats på varje persons saker i agarregistret.

Säg till om du hittar en ren sql lösning som fungerar utan att i förväg på något sätt veta alla sak_id på de saker med röd färg.
Citera
2010-08-02, 08:55
  #11
Medlem
Men jag tror att du är inne på rätt spår med NOT IN, att få en lista med folk som inte har en eller flera saker som är röda, och sedan invertera svaret med NOT EXISTS. Men att bara sätt NOT IN verkar inte funka för jag får även med folks som har alla röda saker i listan.
Citera
2010-08-02, 10:42
  #12
Medlem
NOT IN ger dessvärre bara de svar där villkoret inte finns med i listan överhuvudtaget.

En annan approach är att använda en aggregerad funktion. Detta förutsätter att en person bara äger noll eller en av varje sak. Annars får du baka in en distinct sats i en subquery någonstans (eftersom mig veterligen Access stödjer varesig CTE'er eller temp-tabeller).

Vad du gör är att du bakar in en SELECT xxx, COUNT(yyy) i en subquery där du helt enkelt räknar hur många unika röda (i det här fallet) saker och jämför detta i den yttre SELECT-satsen med hur många röda saker som du letar efter och sedan i vanlig ordning går vidare och joinar resten av uppgifterna som du är ute efter.

Korrekt skriven med lite förarbete så ger detta rätt svar. Bör också vara den variant med lägst komplexitet om du vill slippa flera nästlade subqueries eller långsamma IN eller NOT EXISTS satser. Kan säkert komma på några andra varianter men har för mig att det är den ovanstående som jag allra oftast använder.
Citera
  • 1
  • 2

Stöd Flashback

Flashback finansieras genom donationer från våra medlemmar och besökare. Det är med hjälp av dig vi kan fortsätta erbjuda en fri samhällsdebatt. Tack för ditt stöd!

Stöd Flashback