Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Jaka jest różnica między tymi dwoma zapytaniami, jeśli chodzi o uzyskiwanie dwóch różnych zestawów wyników?

To naprawdę nie ma znaczenia, kiedy robisz to w INNER JOIN.

Jednak gdy używasz LEFT lub RIGHT JOIN, tak zrób różnicę, czy umieścisz dodatkowy filtr w klauzuli JOIN, czy w klauzuli WHERE.

Po umieszczeniu filtru w klauzuli WHERE SQL Server najpierw wykonuje sprzężenie, a następnie całkowicie odfiltrowuje wiersze, do których filtr nie pasuje.
--> zmniejszy to liczbę zwracanych wierszy

Po umieszczeniu filtra w JOIN SQL Server wykonuje filtrowanie podczas łączenia, ale tylko w tabeli, w której umieściłeś filtr.
Nadal otrzymujesz wszystkie wiersze z innych tabel, ale tylko te mają dane z przefiltrowanej tabeli, do której pasuje filtr.
--> nie zmniejszy to liczby wierszy, ale kolumny z danymi z tabeli filtrów będą puste w większej liczbie wierszy

Trudno to wyjaśnić... żeby było to bardziej jasne, oto przykład:

Weź przykładowe dane z Odpowiedź 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)

...i uruchom na nim następujące zapytania:

/* 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 

Zwróć uwagę na różne wyniki wskazane w komentarzach.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jaka jest najlepsza praktyka dotycząca kluczy podstawowych w tabelach?

  2. Jak mogę zablokować tabelę podczas odczytu przy użyciu Entity Framework?

  3. Znajdowanie poprzedniej niezerowej wartości z listy uporządkowanej według daty

  4. Utwórz kopię zapasową bazy danych w SQL Server 2017

  5. Jak stworzyć alias bazy danych w SQL Server