2014-09-05 7 views
16

मेरे पास समान कॉलम नाम वाले दो टेबल हैं और मुझे बाएं टेबल से रिकॉर्ड वापस करने की आवश्यकता है जो सही तालिका में नहीं मिलती हैं? मेरे पास प्राथमिक कुंजी (कॉलम) है जो मुझे दोनों टेबलों की तुलना करने में मदद करेगी। कौन सा शामिल होना पसंद है?एसक्यूएल - बाएं टेबल से पंक्तियों को वापस कैसे करें सही तालिका में नहीं मिला?

+1

काफी बुनियादी क्वेरी लगता है ... आपने अभी तक क्या प्रयास किया है? –

+0

बाएं बाहरी जुड़ने का उपयोग करें – Siva

+1

@ शिव बाएं बाहरी बाएं बाएं टेबल से सभी पंक्तियों को वापस लौटाता है भले ही सही तालिका में कोई मिलान रिकॉर्ड न हो। मुझे बाएं टेबल में मिले मिलान रिकॉर्ड लौटने की ज़रूरत है लेकिन सही तालिका में नहीं मिली है। – CloudJedi

उत्तर

17

आप T-SQL के लिए पूछ रहे हैं तो पहले बुनियादी बातों पर ध्यान देता है।

  1. एक cross join सब का सबसे सरल है: वहाँ तीन प्रकार यहां प्रत्येक मिलती है के रूप में तार्किक प्रसंस्करण चरणों में से अपने आप सेट के साथ कर रहे हैं। यह केवल एक लॉजिकल क्वेरी प्रसंस्करण चरण लागू करता है- Cartesian Product यह चरण दो तालिकाओं पर चलता है जो शामिल होने के लिए इनपुट के रूप में प्रदान किए जाते हैं और दोनों के कार्टेसियन उत्पाद का उत्पादन करते हैं। यही है, एक इनपुट से प्रत्येक पंक्ति दूसरे से सभी पंक्तियों से मेल खाती है। तो यदि आपके पास एक टेबल और एन पंक्तियों में एम पंक्तियां हैं, तो आपको परिणाम में एम × एन पंक्तियां मिलती हैं।
  2. फिर Inner joins हैं: वे दो तार्किक क्वेरी प्रोसेसिंग चरणों लागू होते हैं: दो इनपुट तालिकाओं के बीच A Cartesian product में के रूप में एक क्रॉस में शामिल होने, और फिर इसे filters पंक्तियों एक विधेय है कि आप ON खंड (भी Join condition रूप में जाना) में निर्दिष्ट के आधार पर।
  3. अगला के तीसरे प्रकार मिलती Outer Joins आता है: एक outer join में, आप कीवर्ड LEFT OUTER JOIN, RIGHT OUTER JOIN, या तालिका नामों के बीच FULL OUTER JOIN का उपयोग करके एक preserved तालिका के रूप में एक मेज निशान। OUTER कीवर्ड optional है। LEFT कीवर्ड का अर्थ है कि left table की पंक्तियां संरक्षित हैं; RIGHT कीवर्ड का अर्थ है कि right table में पंक्तियां संरक्षित हैं; और FULL कीवर्ड का मतलब है कि both में पंक्तियों left और right टेबल एक outer join की preserved.The तीसरे तार्किक क्वेरी प्रोसेसिंग चरण संरक्षित तालिका ON विधेय के आधार पर अन्य तालिका में मैचों नहीं मिला से पंक्तियों की पहचान करेंगे। यह चरण उन पंक्तियों को शामिल होने वाले पहले दो चरणों द्वारा उत्पादित परिणाम तालिका में जोड़ता है, और NULL अंक उन बाहरी पंक्तियों में शामिल होने के गैर-संरक्षित पक्ष से गुणों के लिए प्लेसहोल्डर्स के रूप में उपयोग करता है।
अब

अगर हम सवाल को देखो: बायां तालिका जो सही तालिका में नहीं पाए जाते हैं में शामिल होने के दाईं ओर से विशेषताओं के लिए Left outer join का उपयोग करें और NULL मूल्यों के साथ पंक्तियों को फ़िल्टर से रिकॉर्ड वापस जाने के लिए ।

1

यह पृष्ठ विभिन्न प्रकार के प्रकारों के साथ-साथ वेन आरेख विज़ुअलाइजेशन की मदद करने के लिए एक सभ्य टूटना देता है ... अच्छी तरह से ... जुड़ने में अंतर को कल्पना करें।

टिप्पणियों के मुताबिक यह इसकी आवाज़ से काफी बुनियादी क्वेरी है, इसलिए आपको जुड़ने और वास्तव में क्या मतलब है के बीच अंतर को समझने की कोशिश करनी चाहिए।

बाहर http://blog.codinghorror.com/a-visual-explanation-of-sql-joins/

आप इस तरह के रूप में एक प्रश्न के लिए देख रहे जांच:

DECLARE @table1 TABLE (test int) 
DECLARE @table2 TABLE (test int) 

INSERT INTO @table1 
(
    test 
) 
SELECT 1 
UNION ALL SELECT 2 

INSERT INTO @table2 
(
    test 
) 
SELECT 1 
UNION ALL SELECT 3 

-- Here's the important part 
SELECT a.* 
FROM @table1 a 
LEFT join @table2 b on a.test = b.test -- this will return all rows from a 
WHERE b.test IS null -- this then excludes that which exist in both a and b 

-- Returned results: 

2 
2

मैं कुछ अन्य उत्तरों के लिए कोड उदाहरण के अलावा कुछ भी नहीं जोड़ सकता: हालांकि, मुझे लगता है कि यह कार्रवाई में इसे देखने में उपयोगी हो सकता है (अन्य उत्तरों, मेरी राय में, बेहतर है क्योंकि वे इसे समझाते हैं)।

DECLARE @testLeft TABLE (ID INT, SomeValue VARCHAR(1)) 
DECLARE @testRight TABLE (ID INT, SomeOtherValue VARCHAR(1)) 

INSERT INTO @testLeft (ID, SomeValue) VALUES (1, 'A') 
INSERT INTO @testLeft (ID, SomeValue) VALUES (2, 'B') 
INSERT INTO @testLeft (ID, SomeValue) VALUES (3, 'C') 


INSERT INTO @testRight (ID, SomeOtherValue) VALUES (1, 'X') 
INSERT INTO @testRight (ID, SomeOtherValue) VALUES (3, 'Z') 

SELECT l.* 
FROM 
    @testLeft l 
    LEFT JOIN 
    @testRight r ON 
     l.ID = r.ID 
WHERE r.ID IS NULL 
+0

अगर आप Mysql अंतिम पंक्ति की जगह का उपयोग कर रहे \t कहां r.ID शून्य है \t कहां IsNull (r.ID) – Ananda

23

अधिक इस लेख को पढ़ने के लिए कृपया इस

SELECT f.* 
FROM first_table f LEFT JOIN second_table s ON f.key=s.key 
WHERE s.key is NULL 

का प्रयास करें: Joins in Sql Server

enter image description here

+0

कुंजी है शून्य है नहीं = शून्य –

+0

@HaydenThring s.key = शून्य कोई मिलता-जुलता पंक्ति का अर्थ है साथ दूसरी तालिका में पाया गया, इसलिए स्थिति सच है मुझे लगता है कि –

+0

क्षमा करें मेरा मतलब है "काम करने के लिए यह कुंजी है" इस जवाब में एक चर के रूप में "कुंजी" के उपयोग से उलझन में नहीं है –

2

मैं भी मौजूद नहीं है का उपयोग करना चाहते। जब प्रदर्शन की बात आती है तो सूचकांक सही ढंग से इसे बाएं जॉइन या बेहतर के रूप में करना चाहिए। इसके अलावा पढ़ने के लिए आसान है।

SELECT Column1 
FROM TableA a 
WHERE NOT EXISTS (SELECT Column1 
        FROM Tableb b 
        WHERE a.Column1 = b.Column1 
       ) 
0

यह वास्तविक जीवन काम से एक उदाहरण है, मैं उन है कि पिछले 6 महीनों में हमारी साइट से खरीदा की एक सूची की आपूर्ति करने के लिए कहा गया था, लेकिन पिछले 3 महीने में नहीं।

मेरे लिए, सबसे समझ में आता है जिस तरह से मैं के बारे में सोच सकते हैं, ताकि तरह है:

--Users that bought from us 6 months ago and between 3 months ago. 
DECLARE @6To3MonthsUsers table (UserID int,OrderDate datetime) 
INSERT @6To3MonthsUsers 
    select u.ID,opd.OrderDate 
     from OrdersPaid opd 
     inner join Orders o 
     on opd.OrderID = o.ID 
     inner join Users u 
     on o.BuyerID = u.ID 
     where 1=1 
     and opd.OrderDate BETWEEN DATEADD(m,-6,GETDATE()) and DATEADD(m,-3,GETDATE()) 

--Users that bought from us in the last 3 months 
DECLARE @Last3MonthsUsers table (UserID int,OrderDate datetime) 
INSERT @Last3MonthsUsers 
    select u.ID,opd.OrderDate 
     from OrdersPaid opd 
     inner join Orders o 
     on opd.OrderID = o.ID 
     inner join Users u 
     on o.BuyerID = u.ID 
     where 1=1 
     and opd.OrderDate BETWEEN DATEADD(m,-3,GETDATE()) and GETDATE() 

अब, मेरे हाथ में इन 2 टेबल मैं मेज से केवल उन पाने के लिए @ 6To3MonthsUsers की जरूरत के साथ कि @ Last3MonthsUsers तालिका में नहीं हैं।

है कि प्राप्त करने के लिए 2 सरल तरीके हैं:

  1. का उपयोग करते हुए वाम शामिल हों:

    select distinct a.UserID 
    from @6To3MonthsUsers a 
    left join @Last3MonthsUsers b 
    on a.UserID = b.UserID 
    where b.UserID is null 
    
  2. नहीं में

    :

    select distinct a.UserID 
    from @6To3MonthsUsers a 
    where a.UserID not in (select b.UserID from @Last3MonthsUsers b) 
    

दोनों तरीकों मुझे मिल जाएगा वही परिणाम, मैं व्यक्तिगत रूप से पसंद करता हूं दूसरा तरीका क्योंकि यह अधिक पठनीय है।

संबंधित मुद्दे

 संबंधित मुद्दे