webForumDet fria alternativet

Join-problematik

Databaser & SQL

5 svar · 467 visningar · startad av celia

Medlem sedan dec. 20012 532 inlägg
Frågan#1

Jag har två tabeller, en för priser och en för specialpriser och de ser likadana ut. I pristabellen finns det poster som inte finns i specialpriser, men det kan också finnas poster i specialpris-tabellen som inte finns i pristabellen (jo jag vet att det är idiotiskt!). Hur ska jag få ut alla produkter från båda tabellerna med rätt pris? Primary/Foreign Key är Id.

PRIS
Id
Produkt
Pris

SPECIAL
Id
Produkt
Pris

Medlem sedan sep. 2006867 inlägg
#2

Är det så att om det finns både ett pris och ett specialpris så är det specialpris som skall visas?

Medlem sedan dec. 20012 532 inlägg
#3

headbug skrev:

Är det så att om det finns både ett pris och ett specialpris så är det specialpris som skall visas?

Japp.

Medlem sedan dec. 20025 483 inlägg
#4

Nu talar du inte om vilket DBMS som används, men med MySQL kan du testa

select case
        when dt.spris is null then dt.pprod
        else dt.sprod
       end  as produkt
     , coalesce(dt.spris,dt.ppris) as pris
 from
(select p.id as pid
      , s.id as sid
      , p.produkt as pprod
      , s.produkt as sprod
      , p.pris as ppris
      , s.pris as spris
   from pris p
 left
   join special s
     on p.id = s.id
  union
 select p.id as pid
      , s.id as sid
      , p.produkt as pprod
      , s.produkt as sprod
      , p.pris as ppris
      , s.pris as spris
   from pris p
 right
   join special s
     on p.id = s.id) dt;

Finns stöd för FULL OUTER JOIN blir subqueryn litet mindre:

 select p.id as pid
      , s.id as sid
      , p.produkt as pprod
      , s.produkt as sprod
      , p.pris as ppris
      , s.pris as spris
   from pris p
full
 outer
   join special s
     on p.id = s.id

(Något sådant i alla fall.)

Medlem sedan dec. 20012 532 inlägg
#5

Jag använder Access. Stöder Access Full outer join?

Medlem sedan dec. 20025 483 inlägg
#6

Tveksamt. Du får nog försöka dig på den första varianten

select iif(dt.spris is null,dt.pprod,dt.sprod) as produkt
     , iif(dt.spris is null,dt.ppris,dt.spris) as pris
 from
(select p.id as pid
      , s.id as sid
      , p.produkt as pprod
      , s.produkt as sprod
      , p.pris as ppris
      , s.pris as spris
   from pris p
 left
   join special s
     on p.id = s.id
  union
 select p.id as pid
      , s.id as sid
      , p.produkt as pprod
      , s.produkt as sprod
      , p.pris as ppris
      , s.pris as spris
   from pris p
 right
   join special s
     on p.id = s.id) dt;

Möjligen kan Access vilja ha fler parenteser kring något uttryck.

257 ms totalt · 4 externa anrop · v20260731065814-full.1dc6f849
121 ms — deklarationer (db)
0 ms — hämta statistik (cache)
128 ms — hämta tråd, inlägg och bilagor (db)
126 ms — ändringar (db)