sql >> Database teknologi >  >> RDS >> Sqlserver

WHERE-klausul vs ON ved brug af JOIN

Bare vær forsigtig med forskellen med ydre sammenføjninger. En forespørgsel, hvor et filter på b.IsApproved (på den højre tabel, Bar) tilføjes til ON betingelse for JOIN :

SELECT * 
FROM Foo f 
LEFT OUTER JOIN Bar b ON (b.IsApproved = 1) AND (b.BarId = f.BarId); 

Er IKKE det samme som at placere filteret i WHERE klausul:

SELECT * 
FROM Foo f 
LEFT OUTER JOIN Bar b ON (b.BarId = f.BarId)
WHERE (b.IsApproved = 1); 

Siden for 'mislykkedes' ydre joinforbindelser til Bar (dvs. hvor der ikke er nogen b.BarId for en f.BarId ), vil dette efterlade b.IsApproved som NULL for alle sådanne mislykkede join-rækker, og disse rækker vil så blive filtreret fra.

En anden måde at se dette på er, at for den første forespørgsel, LEFT OUTER JOIN Bar b ON (b.IsApproved =1) AND (b.BarId =f.BarId) vil altid returnere de VENSTRE tabelrækker, da LEFT OUTER JOIN garanterer, at de VENSTRE tabelrækker vil blive returneret, selvom sammenkædningen mislykkes. Men effekten af ​​at tilføje (b.IsApproved =1) til LEFT OUTER JOIN on condition er at nulstille eventuelle højre tabelkolonner, når (b.IsApproved =1) er falsk, dvs. i henhold til de samme regler, der normalt gælder for en LEFT JOIN betingelse på (b.BarId =f.BarId) .

Opdater :For at fuldføre spørgsmålet stillet af Conrad vil den tilsvarende LOJ for et VALGFRI filter være:

SELECT * 
FROM Foo f 
LEFT OUTER JOIN Bar b ON (b.BarId = f.BarId)
WHERE (b.IsApproved IS NULL OR b.IsApproved = 1);

dvs. WHERE klausul skal både overveje betingelsen om, hvorvidt joinforbindelsen mislykkes (NULL) og filteret skal ignoreres, og hvor sammenføjningen lykkes, og filteret skal anvendes. (b.IsApproved eller b.BarId kunne testes for NULL )

Jeg har sat en SqlFiddle sammen her, som viser forskellene mellem de forskellige placeringer af b.IsApproved filter i forhold til JOIN .



  1. Vil du inkludere overskrifter, når du bruger SELECT INTO OUTFILE?

  2. Hvorfor bruge ikke null primær nøgle i TSQL?

  3. Sådan drager du fordel af de nye partitioneringsfunktioner i PostgreSQL 11

  4. Får du ugenummer fra en dato i MS SQL Server 2005?