sql >> Database teknologi >  >> RDS >> Mysql

INNER JOIN-betingelsen i WHERE-klausulen eller ON-klausulen?

For indre sammenføjninger som denne er de logisk ækvivalente. Du kan dog løbe ind i situationer, hvor en betingelse i join-klausulen betyder noget andet end en betingelse i where-klausulen.

Som en simpel illustration, forestil dig, at du laver en venstre join som sådan;

select x.id
from x
       left join y
         on x.id = y.id
;

Her tager vi alle rækkerne fra x, uanset om der er et matchende id i y. Lad os nu sige, at vores deltagelsesbetingelse vokser - vi leder ikke kun efter match i y baseret på id'et, men også på id_type.

select x.id
from x
       left join y
         on x.id = y.id
         and y.id_type = 'some type'
;

Igen giver dette alle rækkerne i x, uanset om der er en matching (id, id_type) i y.

Dette er dog meget anderledes:

select x.id
from x
       left join y
         on x.id = y.id
where y.id_type = 'some type'
;

I denne situation vælger vi alle rækkerne af x og prøver at matche rækkerne fra y. Nu for rækker, hvor der ikke er match i y, vil y.id_type være null. På grund af det er y.id_type ='en eller anden type' ikke opfyldt, så de rækker, hvor der ikke er nogen match, kasseres, hvilket reelt gjorde dette til en indre joinforbindelse.

Lang historie kort:for indre sammenføjninger er det lige meget, hvor betingelserne går hen, men for ydre sammenføjninger kan det.



  1. Ændring af SQL-forespørgsel fra én tilstand til flere

  2. MySql - bestil efter strengværdi først

  3. ORA-06508:PL/SQL:kunne ikke finde den programenhed, der kaldes

  4. PgBouncer 1.7 - "Farver varierer efter opstandelse"