Táblák összekötése (WHERE vagy JOIN)

Táblák összekötése (WHERE vagy JOIN)
2016-10-03T11:21:13+02:00
2016-10-04T16:37:54+02:00
2022-12-04T02:05:37+01:00
Tequila
Sziasztok!

Standard SQL-t tanulok éppen (99-es szabvány). A táblák összekötésére a könyv a
WHERE  tabla1.mezo1 = tabla2.mezo1 logikát alkalmazza. Ez így oké. Most elértem a JOIN részhez, amire szintén azt írja (ill. az interneten keresve is erre jutottam), hogy táblák összekapcsolására való. Ezzel jól be is kavartak. A SELF JOIN-nak még látom is értelmét, de most már nem tudom, hogy akkor mikor, melyik módszert (WHERE.... vs. JOIN)alkalmazzuk a táblák összekapcsolására. Ez lenne a kérdésem is. 

Köszönöm előre is.

Üdv, T
Mutasd a teljes hozzászólást!
Képzelj el egy egyszerű 2 táblás 1-N kapcsolatot, pl. gyártók - termékek, ahol:
- 1 terméknek pontosan 1 gyártója van
- 1 gyártónak akármennyi (akár 0) terméke lehet

Készítsd el a táblákat, és töltsd fel minta-adatokkal!

Csinálj egy (pontosan 1 db., tehát al-lekérdezések, és egyéb segéd-lekérdezések nélkül) egyszerű lekérdezést, ami listázza az összes gyártót, és azok összes termékét!
Azok a gyártók is legyenek benne az eredményben, amiknek nincs termékük (vigyél fel ilyen minta-adatot is)!

Ha ez sikerül, akkor valószínűleg megértetted a LEFT JOIN fogalmát.
Ha ezután olvasol egy kicsit, akkor rájössz, hogy ezzel együtt a RIGHT JOIN-t is megértetted,
és az INNER JOIN-t pedig már alapból tudtad :)
Mutasd a teljes hozzászólást!

  • Szia!

    Leginkább kapcsolótáblák részvételénél használatos a join, esetleg ha 2 (vagy több táblából van szükséged az adatokra, mert úgy volt jobb elhelyezni, de megjeleníteni meg most épp együtt kéne). A kapcsolótáblák azok a táblák amik csak ID-ket tartalmaznak és ezekkel kapcsolják össze az adatokat különböző táblákból.

    A kapcsolótáblában lévő azonosítókat használva több táblából kérdezhetünk egyszere kapván egy összesített adathalmazt.

    Valamint, nem tudom, ki hogy tartja itt, de általánosságban az a vélemény tudomásom szerint, hogy egy join, mindíg gyorsabb mint egy where kapcsolás vagy egy subselect. Szerintem szituáció függő, biztos vannak esetek mikor nem gyorsabb.

    Remélem segített, ha valamit kihagytam, majd biztos pontosítanak a többiek.
    ( vagy elindul vita / savazás, hogy melyik a gyorsabb.. :D )

    Üdv
    Mutasd a teljes hozzászólást!
  • Képzelj el egy egyszerű 2 táblás 1-N kapcsolatot, pl. gyártók - termékek, ahol:
    - 1 terméknek pontosan 1 gyártója van
    - 1 gyártónak akármennyi (akár 0) terméke lehet

    Készítsd el a táblákat, és töltsd fel minta-adatokkal!

    Csinálj egy (pontosan 1 db., tehát al-lekérdezések, és egyéb segéd-lekérdezések nélkül) egyszerű lekérdezést, ami listázza az összes gyártót, és azok összes termékét!
    Azok a gyártók is legyenek benne az eredményben, amiknek nincs termékük (vigyél fel ilyen minta-adatot is)!

    Ha ez sikerül, akkor valószínűleg megértetted a LEFT JOIN fogalmát.
    Ha ezután olvasol egy kicsit, akkor rájössz, hogy ezzel együtt a RIGHT JOIN-t is megértetted,
    és az INNER JOIN-t pedig már alapból tudtad :)
    Mutasd a teljes hozzászólást!
  • Mutasd a teljes hozzászólást!
  • Már utána olvastam neten. LEFT, RIGHT, INNER JOIN fogalom, szintaktika rendben, felfogtam. Csak nem találtam még olyan példát, amit feltétellel nem tudtam felírni, JOIN-al pedig igen (kivétel talán a SELF JOIN) ezért nem érzem mikor melyiket kell használni. Annyi lenne amit Phresh írt? A gyorsaság?
    Mutasd a teljes hozzászólást!
  • Ez hasznos, köszönöm!
    Mutasd a teljes hozzászólást!
  • "

    Csak nem találtam még olyan példát, amit feltétellel nem tudtam felírni, JOIN-al pedig igen

    "

    Persze kiegészítve UNION, INTERSEC, MINUS utasításokkal.
    Mutasd a teljes hozzászólást!
  • Gyorsaság, kényelem...

    pookie2 nagyon jó példát írt, erre is a leggyakoribb eljárás a left join., de lényegében mivel többféleképp is megoldható a legtöbb helyzet, így a választás kényelmi szempont, ha gyorsaságot nem tekintjük (mert ebben azért sokszor eltérnek a vélemények)


    Szerk.: Mondjuk kicsit bonyolultabb helyzetben, amit írtam pl kapcsolótáblánál, ami mondjuk 5-6 táblát kapcsol össze és azokól kell egy összesített nézet, valószínüleg megoldható az is where-el, de igen kacifántos lehet, még sosem próbáltam. Ilyenkor áttekinthetőbb és logikusabb választás egy dzsojin. :)
    Mutasd a teljes hozzászólást!
  • Helló,

    Egy soktáblás lekérdezésnél nagyon jól jön, hogy a join feltételek a join -okban vannak, a where-ben pedig csak a where feltételek. Ha van mondjuk 10 táblád, akkor joinok nélkül a where-ben legalább 9 sorod lenne + mondjuk 2 sor "igazi" szűrés. Ebből a 11 sorból ránézésre szűrd ki a 2 "igazi"-t... Míg, ha a join feltételek a join-okba kerülnek, akkor a where-ben csak a 2 "igazi" szűrő sor lesz, a többi a join-okban, ez így sokkal inkább átlátható.

    Arról már ne is beszéljünk, hogy a néhány adatbáziskezelőben (pl. Oracle) nem lehet több oszlopra outer join-t definiálni a where-feltételben, míg a join-ban lehet.

    Üdv

    GyK
    Mutasd a teljes hozzászólást!
  • Összeállt a kép, köszönöm, minden válasz hasznos volt!

    Hogyan lehet pontot szétosztani?
    Mutasd a teljes hozzászólást!
  • Szétosztani, nem lehet sajnos (tényleg hasznos lenne néha),  válassz egyet, pl ami a legtöbbet segített és fogadd el azt.

    Üdv
    Mutasd a teljes hozzászólást!
  • Még csak annyi kiegészítés az előttem szólókhoz, hogy nagyon gyenge az az SQL motor, amiben nem ugyanaz lesz a WHERE és JOIN kapcsolásból! Már ha létezik ilyen motor... Az értelmező egyik első dolga, hogy kikeresi a szükséges táblákat és a köztük levő kapcsolatot. Az elméleti könyvek szerint még a SUBSELECT-eket is kiemeli normál JOIN-kapcsolattá, ha csak lehet.

    Sebességre tehát mindegy kell legyen, ezért a praktikus tanács az érvényes: a JOIN-ban jól elkülönül a kapcsolat, a WHERE maradjon a szűrésre.
    Mutasd a teljes hozzászólást!
  • +1 a JOIN-ok használata mellett, ami ANSI szabányos és az adatbázelők többsége ugyanabban a szintaktiban elfogadja. A JOIN-t mondhatjuk univerzális ismeretnek szemben a WHERE-ben lévő táblakapcsolással, aminek a problémái a külső táblakapcsolásoknál (OUTER JOIN-ok) nagyon szépen előjönnek, mert gyártónként előtérő / nem tamogatott / bug-os lehet.
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd