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

Hvad er forskellen på disse to forespørgsler som at få to forskellige resultatsæt?

Det gør virkelig ingen forskel, når du gør dette i INNER JOIN.

Men når du bruger LEFT eller RIGHT JOIN, gør det det gøre en forskel, om du sætter det ekstra filter i JOIN eller i WHERE-sætningen.

Når du sætter filteret ind i WHERE-sætningen, udfører SQL Server joinforbindelsen først og derefter helt filtrerer de rækker ud, hvor filteret ikke passer.
--> dette vil reducere antallet af rækker, der returneres

Når du sætter filteret ind i JOIN, foretager SQL Server filtreringen under joinforbindelsen, men kun på den tabel, hvor du sætter filteret.
Du får stadig alle rækkerne fra de andre tabeller, men kun dem har dataene fra den filtrerede tabel, hvor filteret passer.
--> dette vil ikke reducere antallet af rækker, men kolonnerne med data fra filtertabellen vil være tomme i flere rækker

Det er svært at forklare...for at gøre det mere klart, her er et eksempel:

Tag eksempeldata fra 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)

...og kør følgende forespørgsler på det:

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

Bemærk de forskellige resultater som angivet i kommentarerne.



  1. Opret forbindelse til en ekstern MySQL-database ved hjælp af Android

  2. mySQL Trigger virker efter konsolindsættelse, men ikke efter scriptindsættelse

  3. Kan jeg ændre AutoCommit-egenskaben for en JDBC-forbindelse flere gange

  4. Hvad er dine yndlings Ruby on Rails-bøger og hvorfor?