Daugiau
SQL sujungimas: kur sąlyga vs. on sąlyga
Perskaičius, tai nėra Explicit vs Implicit SQL Joins dublikatas. Atsakymas gali būti susijęs (ar net toks pats), bet klausimas skiriasi.
Koks skirtumas ir kas turėtų būti kiekvienoje iš jų?
Jei teisingai suprantu teoriją, užklausų optimizatorius turėtų galėti naudoti abu šiuos elementus pakaitomis.
612
3
Tai nėra tas pats.
Panagrinėkite šias užklausas:
ir
Pirmasis grąžins užsakymą ir jo eilutes, jei tokių yra, užsakymo numeriui
12345
. Antrasis grąžins visus užsakymus, bet tik užsakymas12345
turės su juo susijusių eilučių.Naudojant
INNER JOIN
, šie straipsniai yra efektyviai lygiaverčiai. Tačiau vien tai, kad jie funkciškai yra vienodi, t. y. duoda tuos pačius rezultatus, nereiškia, kad šių dviejų rūšių sąlygos turi tą pačią semantinę reikšmę.Naudojant
INNER JOIN
jie yra pakeičiami, o optimizatorius juos pertvarkys pagal pageidavimą.Priklausomai nuo to, nuo kurios sujungimo pusės jie priklauso, jungiant
OUTER JOIN
, jie nebūtinai yra sukeičiami vietomis.Aš juos įrašau bet kurioje vietoje, priklausomai nuo skaitomumo.
Vidiniame sujungime jie reiškia tą patį. Tačiau išorinio sujungimo rezultatai skirsis priklausomai nuo to, ar sujungimo sąlygą įrašysite į WHERE, ar į ON sąlygą. Pažvelkite į šį susijusį klausimą ir šį atsakymą (mano).
Manau, kad prasmingiausia jungimo sąlygą visuomet pateikti ON sąlygoje (nebent tai išorinis sujungimas ir iš tikrųjų norite, kad ji būtų pateikta Where sąlygoje), nes visiems, skaitantiems jūsų užklausą, bus aiškiau, kokiomis sąlygomis lentelės yra sujungiamos, be to, tai padės išvengti, kad WHERE sąlyga būtų dešimčių eilučių ilgio.