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:
  1. select * from szamla_resz_fizetes   
  2. if(szamla_resz_fizetes .azonosito like('%PU%'))   
  3. left join bejovo_szamla on(bejovo_szamla_fejlec.azonosito = szamla_resz_fizetes.azonosito)   
  4. ELSE   
  5. left join szamla on (szamla.azonosito = szamla_resz_fizetes.azonosito)   
  6. 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:
  1. SELECT  
  2.     *  
  3. FROM  
  4.     szamla_resz_fizetes r  
  5. LEFT JOIN  
  6.     bejovo_szamla b ON (  
  7.         r.azonosito LIKE '%PU%' AND  
  8.         b.azonosito = r.azonosito  
  9.     )  
  10. LEFT JOIN  
  11.     szamla s ON (  
  12.         r.azonosito NOT LIKE '%PU%' AND  
  13.         s.azonosito = r.azonosito  
  14.     )  
  15. WHERE  
  16.     '2015-01-01' <= datum AND datum <= '2016-01-01'  
  17. ;  
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:
  1. SELECT  
  2.     *  
  3. FROM  
  4.     szamla_resz_fizetes r  
  5. LEFT JOIN  
  6.     bejovo_szamla b ON (b.azonosito = r.azonosito)  
  7. WHERE  
  8.     r.azonosito LIKE '%PU%' AND  
  9.     ('2015-01-01' <= datum AND datum <= '2016-01-01')  
  10. UNION  
  11. SELECT  
  12.     *  
  13. FROM  
  14.     szamla_resz_fizetes r  
  15. LEFT JOIN  
  16.     szamla s ON (s.azonosito = r.azonosito)  
  17. WHERE  
  18.     r.azonosito NOT LIKE '%PU%' AND  
  19.     ('2015-01-01' <= datum AND datum <= '2016-01-01')  
  20. ;  
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:
  1. WHERE  
  2.     ('2015-01-01' <= r.datum AND r.datum <= '2016-01-01'AND  
  3.     (  
  4.         (r.azonosito LIKE '%PU%' AND b.valuta LIKE '%HUF%'OR  
  5.         (r.azonosito NOT LIKE '%PU%' AND s.valuta LIKE '%HUF%')  
  6.     )  
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....