Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Qual é a diferença nessas duas consultas ao obter dois conjuntos de resultados diferentes?


Realmente não faz diferença quando você faz isso no INNER JOIN.

No entanto, quando você usa LEFT ou RIGHT JOIN, ele faz faz diferença se você coloca o filtro adicional na cláusula JOIN ou na cláusula WHERE.

Quando você coloca o filtro na cláusula WHERE, o SQL Server faz a junção primeiro e depois completamente filtra as linhas em que o filtro não se encaixa.
--> isso reduzirá o número de linhas retornadas

Quando você coloca o filtro no JOIN, o SQL Server faz a filtragem durante o join, mas apenas na tabela onde você colocou o filtro.
Você ainda obtém todas as linhas das outras tabelas, mas apenas essas possuem os dados da tabela filtrada onde o filtro se encaixa.
--> isso não reduzirá o número de linhas, mas as colunas com dados da tabela de filtros ficarão vazias em mais linhas

É difícil explicar... para deixar mais claro, aqui está um exemplo:

Pegue os dados de amostra de Resposta do 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)

... e execute as seguintes consultas nele:
/* 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 

Observe os diferentes resultados, conforme indicado nos comentários.