sql >> Database >  >> RDS >> Sqlserver

Twee selects of één select + één join in SQL?

Uw idee dat zij hetzelfde werk zouden moeten doen, is niet waar. Stel je deze testset met gegevens voor:

T1

ID
----
1
2
3
4
5

T2

ID
---
1
1
1
2
2
3

DDL

CREATE TABLE dbo.T1 (ID INT NOT NULL);
INSERT dbo.T1 (ID) VALUES (1), (2), (3), (4), (5);

CREATE TABLE dbo.T2 (ID INT NOT NULL);
INSERT dbo.T2 (ID) VALUES (1), (1), (1), (2), (2), (3);

SELECT  *
FROM    dbo.T1
WHERE   T1.ID IN (SELECT T2.ID FROM dbo.T2);

SELECT  T1.*
FROM    dbo.T1
        INNER JOIN dbo.T2
            ON T1.ID = T2.ID;

Resultaten

ID
---
1
2
3

ID
---
1
1
1
2
2
3

Uw resultaten zijn alleen hetzelfde als de kolom waarin u zoekt uniek is.

CREATE TABLE dbo.T1 (ID INT NOT NULL);
INSERT dbo.T1 (ID) VALUES (1), (2), (3), (4), (5);

CREATE TABLE dbo.T2 (ID INT NOT NULL);
INSERT dbo.T2 (ID) VALUES (1), (2), (3);

SELECT  *
FROM    dbo.T1
WHERE   T1.ID IN (SELECT T2.ID FROM dbo.T2);

SELECT  T1.*
FROM    dbo.T1
        INNER JOIN dbo.T2
            ON T1.ID = T2.ID;

Hoewel de resultaten hetzelfde zijn, is het uitvoeringsplan dat niet. De eerste zoekopdracht met IN kan een antisemi-join gebruiken, wat betekent dat het weet dat de gegevens in t2 niet nodig zijn, dus zodra het een enkele overeenkomst vindt, kan het stoppen met zoeken naar verdere overeenkomsten.

Als u uw tweede tabel beperkt tot alleen unieke waarden, ziet u hetzelfde plan:

CREATE TABLE dbo.T1 (ID INT NOT NULL PRIMARY KEY);
INSERT dbo.T1 (ID) VALUES (1), (2), (3), (4), (5);

CREATE TABLE dbo.T2 (ID INT NOT NULL PRIMARY KEY);
INSERT dbo.T2 (ID) VALUES (1), (2), (3);

SELECT  *
FROM    dbo.T1
WHERE   T1.ID IN (SELECT T2.ID FROM dbo.T2);

SELECT  T1.*
FROM    dbo.T1
        INNER JOIN dbo.T2
            ON T1.ID = T2.ID;

Samenvattend zullen de twee zoekopdrachten niet altijd dezelfde resultaten opleveren en niet altijd hetzelfde plan hebben. Het hangt echt af van uw indexen en de breedte van uw gegevens/query.



  1. Hoe JOIN te gebruiken in Yii2 Active Record voor relationeel model?

  2. MySQL-verbinding via SSH-tunnel

  3. 6 manieren om een ​​string te converteren naar een datum/tijd-waarde in SQL Server

  4. MySQL-query voor wederzijdse vrienden