आपकी यह धारणा कि उन्हें समान कार्य करना चाहिए, सत्य नहीं है। डेटा के इस परीक्षण सेट की कल्पना करें:
T1
ID
----
1
2
3
4
5
T2
ID
---
1
1
1
2
2
3
डीडीएल
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;
परिणाम
ID
---
1
2
3
ID
---
1
1
1
2
2
3
आपके परिणाम केवल वही होंगे यदि आप जिस कॉलम में खोज रहे हैं वह अद्वितीय है।
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;
भले ही परिणाम समान हों, निष्पादन योजना नहीं है। IN
. का उपयोग करने वाली पहली क्वेरी एक एंटी-सेमी जॉइन का उपयोग करने में सक्षम है, जिसका अर्थ है कि यह जानता है कि t2 में डेटा की आवश्यकता नहीं है, इसलिए जैसे ही उसे एक भी मैच मिलता है, वह आगे के मैचों के लिए स्कैन करना बंद कर सकता है।
यदि आप अपनी दूसरी तालिका को केवल अद्वितीय मान रखने के लिए विवश करते हैं, तो आपको वही योजना दिखाई देगी:
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;
संक्षेप में, दो प्रश्न हमेशा समान परिणाम नहीं देंगे, और उनके पास हमेशा एक ही योजना नहीं होगी। यह वास्तव में आपकी अनुक्रमणिका और आपके डेटा/क्वेरी की चौड़ाई पर निर्भर करता है।