Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

दो चयन या एक चयन + एक एसक्यूएल में शामिल हो?

आपकी यह धारणा कि उन्हें समान कार्य करना चाहिए, सत्य नहीं है। डेटा के इस परीक्षण सेट की कल्पना करें:

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;

संक्षेप में, दो प्रश्न हमेशा समान परिणाम नहीं देंगे, और उनके पास हमेशा एक ही योजना नहीं होगी। यह वास्तव में आपकी अनुक्रमणिका और आपके डेटा/क्वेरी की चौड़ाई पर निर्भर करता है।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL सर्वर 2005 CHARINDEX () का उपयोग करके एक स्ट्रिंग को विभाजित करने के लिए

  2. डिफ़ॉल्ट सिस्टमडेट को ymd से dmy . में कैसे बदलें

  3. पायथन 3.3 को माइक्रोसॉफ्ट एसक्यूएल सर्वर 2008 से जोड़ना

  4. SQL सर्वर 2014/2016 OLTP वर्कलोड के लिए प्रैक्टिकल प्रोसेसर चयन

  5. डेटाबेस में सभी ऑब्जेक्ट्स के लिए प्रोग्रामेटिक रूप से स्क्रिप्ट उत्पन्न करें