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.

Sprendimas

Tai nėra tas pats.

Panagrinėkite šias užklausas:

SELECT *
FROM Orders
LEFT JOIN OrderLines ON OrderLines.OrderID=Orders.ID
WHERE Orders.ID = 12345

ir

SELECT *
FROM Orders
LEFT JOIN OrderLines ON OrderLines.OrderID=Orders.ID 
    AND Orders.ID = 12345

Pirmasis grąžins užsakymą ir jo eilutes, jei tokių yra, užsakymo numeriui 12345. Antrasis grąžins visus užsakymus, bet tik užsakymas 12345 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ę.

Komentarai (10)

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.

Komentarai (2)

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.

Komentarai (0)