sql >> Database >  >> RDS >> Sqlserver

Wat is het verschil tussen deze twee query's als het krijgen van twee verschillende resultatensets?

Het maakt echt geen verschil wanneer je dit doet in de INNER JOIN.

Wanneer u echter LEFT of RIGHT JOIN gebruikt, wel maakt het verschil of u het extra filter in de JOIN- of in de WHERE-component plaatst.

Wanneer u het filter in de WHERE-component plaatst, voert SQL Server eerst de join uit en vervolgens volledig filtert de rijen uit waar het filter niet past.
--> dit vermindert het aantal rijen dat wordt geretourneerd

Wanneer je het filter in de JOIN plaatst, doet SQL Server het filteren tijdens de join, maar alleen op de tabel waar je het filter plaatst.
Je krijgt nog steeds alle rijen van de andere tabellen, maar alleen die hebben de gegevens uit de gefilterde tabel waar het filter past.
--> dit zal het aantal rijen niet verminderen, maar de kolommen met gegevens uit de filtertabel zullen leeg zijn in meer rijen

Het is moeilijk uit te leggen... om het duidelijker te maken, hier is een voorbeeld:

Neem de voorbeeldgegevens van Het antwoord van 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)

...en voer de volgende zoekopdrachten uit:

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

Let op de verschillende resultaten zoals aangegeven in de opmerkingen.



  1. Hoe een voorwaardelijke opgeslagen Upsert-procedure implementeren?

  2. Omgekeerde limiet?

  3. Hoe de waarde van een externe sleutel in de mysql-database bij te werken?

  4. Variabelen gebruiken als OFFSET in SELECT-statments in de opgeslagen functies van mysql