sql >> Databasteknik >  >> RDS >> Sqlserver

Vad är skillnaden mellan dessa två frågor och att få två olika resultatuppsättningar?

Det gör verkligen ingen skillnad när du gör detta i INNER JOIN.

Men när du använder LEFT eller RIGHT JOIN, gör det det gör en skillnad om du lägger in det extra filtret i JOIN eller i WHERE-satsen.

När du sätter filtret i WHERE-satsen gör SQL Server joinen först och sedan helt filtrerar bort de rader där filtret inte passar.
--> detta kommer att minska antalet rader som returneras

När du sätter filtret i JOIN, gör SQL Server filtreringen under joinen, men bara på tabellen där du placerar filtret.
Du får fortfarande alla rader från de andra tabellerna, men bara de har data från den filtrerade tabellen där filtret passar.
--> detta kommer inte att minska antalet rader, men kolumnerna med data från filtertabellen kommer att vara tomma i fler rader

Det är svårt att förklara...för att göra det tydligare, här är ett exempel:

Ta exempeldata från RedFilters svar :

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)

...och kör följande frågor på den:

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

Notera de olika resultaten som anges i kommentarerna.



  1. MySQL DELETE FROM med subquery som villkor

  2. Sök i MySQL med Spaces

  3. Undantag för MySQL-anslutningen 6.7.4 och Entity Framework 5

  4. Det gick inte att konvertera parametervärde från en sträng till en Int32