Vinnaren i pepparkakshustävlingen!
2013-02-21, 11:58
  #1
Medlem
Hej!

Ny dag nya problem. Får man inte använda or i equijoin?

raden jag får problem med är

Where lower(vgnamn) = 'bondgård' OR lower(vgnamn) ='skäggvård'

om jag tar bort texten från OR funkar sökningen som den ska förrutom att jag bara kan
ha ett sökord... har jag raden som den står här så kommer alla kunder upp.. vad gör jag för fel??


Citera
2013-02-21, 15:10
  #2
Moderator
Protons avatar
Citat:
Ursprungligen postat av SagaIsabella
Hej!

Ny dag nya problem. Får man inte använda or i equijoin?

raden jag får problem med är

Where lower(vgnamn) = 'bondgård' OR lower(vgnamn) ='skäggvård'

om jag tar bort texten från OR funkar sökningen som den ska förrutom att jag bara kan
ha ett sökord... har jag raden som den står här så kommer alla kunder upp.. vad gör jag för fel??


Du fintar bort databasen eftersom den inte kommer veta vilket av uttrycken som hör till or-delen och vilket som hör till AND-delen. Det du troligen vill göra här är att evaluera OR-delen som ett separat predikat i sammanhanget. För att få till det ska du förmodligen sätta hela OR-uttrycket inom paranteser.

För övrigt tycker jag du ska bläddra fram några sidor i boken till du kommer till delen med JOIN och hur du skriver sådana istället för att blöta ner WHERE-villkoret med implicita JOINar såhär.

Kod:
Select distinct kund.knr,kund.fnamn,kund.enamn
From kund
,kundorder,orderrad,artikel,varugrupp
Where 
(lower(vgnamn) = 'bondgård' OR lower(vgnamn) ='skäggvård')
And 
kund.knr =  kundorder.knr
And kundorder.ordnr orderrad.ordnr
And orderrad.artnr artikel.artnr
And artikel.vgnr varugrupp.vgnr
And varugrupp.vgnamn varugrupp.vgnamn
Vad händer om du provar den?
Citera
2013-02-21, 15:38
  #3
Medlem
Då funkar det väldigt bra!

Tack för hjälpen
Citera
2013-02-21, 19:23
  #4
Medlem
John-Pauls avatar
Titta även på hur IN fungerar, det kan ofta användas i.st.f OR och det blir det ett yttryck (utan behov av specificering) och lite mindre text och i mitt tyckte lite lättare att läsa.
Where lower(vgnamn) IN ('bondgård','skäggvård')
Kod:
test_expression [ NOT ] IN 
    ( subquery | expression [ ,...n ]
    ) 
Vilket alltså betyder att: 'bondgård' IN (kolumn1,kolumn2) också är giltigt men inte det du är ute efter här.

Vill du prompt ha dina joins i where villkoret så märk upp detta och börja med dessa
...
-- Joins
Where kund.knr = kundorder.knr
And kundorder.ordnr = orderrad.ordnr
And orderrad.artnr = artikel.artnr
And artikel.vgnr = varugrupp.vgnr
And varugrupp.vgnamn = varugrupp.vgnamn;
-- Selection
and lower(vgnamn) IN ('bondgård','skäggvård')

Men, flytta helst upp dessa.

Och, om du bara ska ha kolumner från kund så ange endast den tabellen och resten är villkor på förekomst.
Select distinct kund.knr,kund.fnamn,kund.enamn
From kund,kundorder
Where lower(vgnamn) IN ('bondgård','skäggvård')
And exists -- och dessa kunder har...
(
select 1
from kundorder,orderrad,artikel,varugrupp
Where kundorder.knr = kund.knr -- kundorder på samma kund som ovan som dessutom har...
And kundorder.ordnr = orderrad.ordnr
And orderrad.artnr = artikel.artnr
And artikel.vgnr = varugrupp.vgnr
And varugrupp.vgnamn = varugrupp.vgnamn;
)
__________________
Senast redigerad av John-Paul 2013-02-21 kl. 19:41.
Citera

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