Opravdu nezáleží na tom, když to uděláte v INNER JOIN.
Když však použijete LEFT nebo RIGHT JOIN, dělá je rozdíl, zda vložíte další filtr do klauzule JOIN nebo do klauzule WHERE.
Když vložíte filtr do klauzule WHERE, SQL Server nejprve provede spojení a poté úplně odfiltruje řádky, kam se filtr nevejde.
--> tím se sníží počet vrácených řádků
Když vložíte filtr do JOIN, SQL Server provede filtrování během spojení, ale pouze na tabulce, kam vložíte filtr.
Stále získáte všechny řádky z ostatních tabulek, ale pouze ty mají data z filtrované tabulky, kam se filtr vejde.
--> tím se nesníží počet řádků, ale sloupce s daty z tabulky filteres budou ve více řádcích prázdné
Je těžké to vysvětlit...aby to bylo jasnější, zde je příklad:
Vezměte ukázková data z Odpověď RedFilter :
CREATE TABLE [dbo].[t1](
[ID] [int] NULL,
[StatusID] [int] NULL
) ON [PRIMARY]
CREATE TABLE [dbo].[t2](
[ID] [int] NULL
) ON [PRIMARY]
INSERT INTO t1 (ID, StatusID) VALUES (1, 10)
INSERT INTO t1 (ID, StatusID) VALUES (2, 11)
INSERT INTO t1 (ID, StatusID) VALUES (3, 12)
INSERT INTO t1 (ID, StatusID) VALUES (4, 12)
INSERT INTO t2 (ID) VALUES (1)
INSERT INTO t2 (ID) VALUES (3)
INSERT INTO t2 (ID) VALUES (5)
...a spusťte na něm následující dotazy:
/* this returns four rows, but only two will have data
from the second table in the second column */
SELECT t1.ID, t2.ID
FROM t1
LEFT JOIN t2 ON t1.Id = t2.Id
/* this returns only one row: the one where t2.ID = 1 */
SELECT t1.ID, t2.ID
FROM t1
LEFT JOIN t2 ON t1.Id = t2.Id
WHERE t2.ID = 1
/* this returns four rows as in the first query, but only one
row will have data in the second column: the one where t2.ID = 1 */
SELECT t1.ID, t2.ID
FROM t1
LEFT JOIN t2 ON t1.Id = t2.Id
AND t2.ID = 1
Všimněte si různých výsledků, jak je uvedeno v komentářích.