ugrás a tartalomhoz

IF LEFT JOIN

simisoma · 2019. Okt. 11. (P), 13.49
Sziasztok,

todnátok segíteni ebben a kérdésben:

Ez persze nem jó :-( csak az elmélete:

select * from szamla_resz_fizetes 
if(szamla_resz_fizetes .azonosito like('%PU%')) 
left join bejovo_szamla on(bejovo_szamla_fejlec.azonosito = szamla_resz_fizetes.azonosito) 
ELSE 
left join szamla on (szamla.azonosito = szamla_resz_fizetes.azonosito) 
ENDIF where datum >= '2015-01-01' and datum <= '2016-01-01';
Azt szeretném elérni, ha az azonosítóban "szamla_resz_fizetes.azonosito" szerepel a PU akkor csatolja mögé (left join -al) a bejövő számla "bejovo_szamla" adatait, ha nem szerepel akkor pedig a számla "szamla" adatait.

Milyen megoldás létezik erre?

Köszi!
 
1

ON

Endyl · 2019. Okt. 11. (P), 15.26
Nem egészen értem a problémát. Ha jól gondolom, akkor a bejovo_szamla táblában csak azokhoz az azonosítókhoz lesznek sorok, amiknél az azonosítóban van "PU", a szamla táblában peddig csak akkor, ha nincs benne "PU".

Ez esetben a JOIN ugye alapból így működik, vagy legalábbis ahol nem talál illeszkedést, ott a vontakozó tábla mezői NULL értékűek lesznek.

Ha mindkét táblában vannak sorok minden azonosítóhoz, csak valamiért a lekérdezésben ki akarnád nullázni az egyes táblákhoz tartozó mezőket a "PU" megléte alapján, akkor:
SELECT
    *
FROM
    szamla_resz_fizetes r
LEFT JOIN
    bejovo_szamla b ON (
        r.azonosito LIKE '%PU%' AND
        b.azonosito = r.azonosito
    )
LEFT JOIN
    szamla s ON (
        r.azonosito NOT LIKE '%PU%' AND
        s.azonosito = r.azonosito
    )
WHERE
    '2015-01-01' <= datum AND datum <= '2016-01-01'
;
De az eredményben ettől még mind a két kapcsolt tábla adatai benne lesznek, csak hol egyik, hol másik NULL lesz.

Ha ezt el szeretnéd kerülni, akkor használhatsz UNION-t is, és a két SELECT WHERE feltételében szűrsz a "PU"-ra, a JOIN ON-ja helyett:
SELECT
    *
FROM
    szamla_resz_fizetes r
LEFT JOIN
    bejovo_szamla b ON (b.azonosito = r.azonosito)
WHERE
    r.azonosito LIKE '%PU%' AND
    ('2015-01-01' <= datum AND datum <= '2016-01-01')
UNION
SELECT
    *
FROM
    szamla_resz_fizetes r
LEFT JOIN
    szamla s ON (s.azonosito = r.azonosito)
WHERE
    r.azonosito NOT LIKE '%PU%' AND
    ('2015-01-01' <= datum AND datum <= '2016-01-01')
;
Ennél ugye azért vigyázni kell, hogy a két SELECT ugyanannyi és ugyanolyan típusú mezőket adjon vissza ugyanolyan sorrendben.

És a teljesség igényének kedvéért leírom, hogy választhatnád azt a meglehetősen ronda megoldást, hogy UNION helyett a mezőkhöz írsz feltételt az eredeti dupla JOIN-os lekérdezésben SELECT IF(r.azonosito LIKE '%PU%', b.valami, s.valami) as valami. Ebben az esetben ezt nem ajánlom se teljesítmény, se fenntarthatóság szempontjából.
2

FELTÉTEL

simisoma · 2019. Okt. 11. (P), 17.39
Szupper, KÖSZÖNÖM!

- Az első verzió tökéletes, de van egy feltételem ami még érdekes:

van olyan feltételem is, hogy valuta, ez csak azért gond mert mindkét táblába szerepel, és így kétértelmű hibát dob :-(

Szóval még

WHERE (ha a szamla_resz_fizetes.azonosito -ban szerepel a like('%PU%') akkor

bejovo_szamla.valuta like('%HUF%')

HA nem szerepel benne akkor

szamla.valuta like('%HUF%')

- az UNION-os megoldást így gondoltam jobb lesz, viszont az azért dob vissza hibát mert nem egyeznek az oszlopok számai :-(

Tudsz még a WHERE részre is segíteni egy feltétel megoldásában?

Hálás köszönet!
3

Nevek

Endyl · 2019. Okt. 11. (P), 19.29
van olyan feltételem is, hogy valuta, ez csak azért gond mert mindkét táblába szerepel, és így kétértelmű hibát dob :-(


A kétértelműséget ki lehet kerülni, ha eléírod, hogy melyik tábla mezőjére hivatkozol, mint a példáimban. Ha jobban belegondolok, akkor gondolom a datum mező a szamla_resz_fizetes táblában van, így azok elé is illene odaírni, hogy "r.".

Feltételezve az első példám elnevezéseit, ilyen lesz a WHERE:
WHERE
    ('2015-01-01' <= r.datum AND r.datum <= '2016-01-01') AND
    (
        (r.azonosito LIKE '%PU%' AND b.valuta LIKE '%HUF%') OR
        (r.azonosito NOT LIKE '%PU%' AND s.valuta LIKE '%HUF%')
    )
Azaz ha az r.azonosito-ban van PU, a b.valuta-ban legyen HUF, vagy ha az r.azonosito-ban nincs PU, akkor a s.valuta-ban legyen HUF.
4

Köszönet !

simisoma · 2019. Okt. 11. (P), 23.03
Köszönet Nektek a segítségért! Így már frankón működik úgy látom....