[megoldva] különböző tábla join annak függvényében, hogy adott érték null vagy sem

Üdv,

(Google-el nem jutottunk düllőre, "conditional join" ésatöbbi nem talált jókat.)

Feladat:
Attól függően, hogy adott sorban az "id" vagy a "mozgas" oszlopban van nem-NULL, join-olni egy adott táblát.

Történet:
Adott egy naplótábla, amiben van két féle termék, egyiknek a "gyszam", másiknak a "mozgas" táblában vannak az adatai. Gyakorlatilag egy felhasználó ID van tárolva mindkettőben.

Magyarázat:
Adott termékadatok az első 3 joinnal lejönnek, de, van a naplónak (cassa tábla) két oszlopa, egyik a "mozgas", másik az "id". Ha telefon, akkor "mozgas" oszlopban "(NULL)" van, ha tartozék, akkor "id" oszlopban van "(NULL)", és a másik oszlopokban van egy ID, ami csatolja őket (join-ok alább).

Azt kéne megoldani, hogy ez alapján csatoljuk be a táblákat, egyik sorban ezt, másikban azt, és a visszajövő felhasználó ID alapján a felhasznalo tablat is bekössük, felhasználó nevet beírjuk. Lehetőleg ugyan abba az oszlopba.

SQL képességeivel nem vagyok tisztában, hogy mennyire képes IF-eket kezelni, egy adott oszlopba beírni két külön forrásból jövő adatot, stb.

MINDEN EGYÉB MEGOLDÁSRA IS NYITOTT VAGYOK.

Alábbi próbálkozásom, amibe kéne még a feltételes csatolás:

SELECT cassa.datum, cassatip.cassatip_nev, osszeg, penzvan, prntip.prntip_nev, cassa.tetel, cassa.megjegyzes, fiztip.fiztip_nev, felhasznalo.felhasznalo, gyszam.felh_elad
FROM cassa
INNER JOIN cassatip ON cassatip.cassatip = cassa.cassatip
INNER JOIN prntip ON prntip.prntip = cassa.prntip
INNER JOIN fiztip ON fiztip.fiztip = cassa.fiztip

# ha tartozék
INNER JOIN mozgas ON mozgas.mozgas = cassa.mozgas
INNER JOIN felhasznalo ON felhasznalo.felhasznalo = mozgas.felh_id

# ha telefon
INNER JOIN gyszam ON gyszam.id = cassa.id

Hozzászólások

Nem esküszöm meg rá, hogy jól értem, amit szeretnél, de itt egy gondolatébresztő:


select * from lx.main

ID          C1         C2
----------- ---------- ----------
          1 aux1       blabla1
          1 aux2       blabla2

select * from lx.aux1"

ID          C
----------- ----------
          1 aux1data


select * from lx.aux2

ID          C
----------- ----------
          1 aux2data


select
  id,
  c1,
  c2,
  case
    when c1='aux1' then
      (select c from lx.aux1 a1 where a1.id=m.id)
    when c1='aux2' then
      (select c from lx.aux2 a2 where a2.id=m.id)
  end as xyz
from lx.main m

ID          C1         C2         XYZ
----------- ---------- ---------- ----------
          1 aux1       blabla1    aux1data
          1 aux2       blabla2    aux2data



Hát ilyenért engem vágtak már "pofán". ;)

UNION - t javasolnék inkább ;)

SELECT cassa.datum, cassatip.cassatip_nev, osszeg, penzvan, prntip.prntip_nev, cassa.tetel, cassa.megjegyzes, fiztip.fiztip_nev, felhasznalo.felhasznalo, gyszam.felh_elad
FROM cassa
INNER JOIN cassatip ON cassatip.cassatip = cassa.cassatip
INNER JOIN prntip ON prntip.prntip = cassa.prntip
INNER JOIN fiztip ON fiztip.fiztip = cassa.fiztip

# ha tartozék
INNER JOIN mozgas ON mozgas.mozgas = cassa.mozgas
INNER JOIN felhasznalo ON felhasznalo.felhasznalo = mozgas.felh_id
WHERE cassa.mozgas is not null

UNION

SELECT cassa.datum, cassatip.cassatip_nev, osszeg, penzvan, prntip.prntip_nev, cassa.tetel, cassa.megjegyzes, fiztip.fiztip_nev, felhasznalo.felhasznalo, gyszam.felh_elad
FROM cassa
INNER JOIN cassatip ON cassatip.cassatip = cassa.cassatip
INNER JOIN prntip ON prntip.prntip = cassa.prntip
INNER JOIN fiztip ON fiztip.fiztip = cassa.fiztip
INNER JOIN gyszam ON gyszam.id = cassa.id
WHERE cassa.id is not null

Persze ezt még lehetne optimálisabbá tenni azért.
Mondjuk outer joinokkal....
;)

LEFT JOIN mindkét asszociációra, aztán SELECT-ben tudsz feltételeket építeni, hogy épp melyiket akarod kiolvasni, melyik nem null.

--
joco voltam szevasz