2013-05-08 5 views
5

यहां मैं यह पूरा करने की कोशिश कर रहा हूं: 1. उपयोगकर्ता तालिका से उपयोगकर्ता आईडी खींचें (document.ownerID उपयोगकर्ता की हैंडल है। हैंडल) 2. उपयोगकर्ताओं के लिए जो एक रिकॉर्ड है कि दस्तावेजों तालिका में पिछले 90 दिनोंएसक्यूएल "जहां मौजूद नहीं है" किसी भी पंक्ति को वापस नहीं कर रहा है

यहाँ के भीतर बनाया गया था न हो क्वेरी मैं अब तक है (मैं एसक्यूएल स्टूडियो प्रबंधन 2012 तक इस चला रहा हूँ):

Select Users.UserID 
From Documents 
Inner Join Users on documents.OwnerID = users.handle 
Where Not Exists 
(
Select * 
From Documents 
Where documents.creationtime >= Dateadd(day, -90, getutcdate()) 
) 
Group by Users.UserID 
Order by Users.UserID ASC 

आउटपुट में कुछ भी वापस नहीं किया जाता है। हालांकि, जब मैं "मौजूद नहीं है" कथन से "नहीं" को हटाता हूं तो मुझे उन उपयोगकर्ताओं का आउटपुट मिलता है जिनके पास रिकॉर्ड है जो पिछले 90 दिनों के भीतर दस्तावेज़ तालिका में बनाया गया था। साथ ही, अगर मैं "> =" संकेतक को "=" में बदलता हूं तो मुझे आउटपुट भी मिलता है। मुझे लगता है कि समस्या यह है कि मुझे EXIST कथन की दृढ़ समझ नहीं है। मैं आपकी मदद की बहुत सराहना करता हूं।

उत्तर

1

यदि आपके पूर्व में मौजूद प्रश्न किसी भी पंक्ति को वापस नहीं करता है तो आपको 0 पंक्तियां वापस मिलेंगी। आप कह रहे हैं "अगर यह क्वेरी कुछ भी नहीं लौटाती है तो मुझे पंक्तियां दें"

संपादित करें: और हाँ, गॉर्डन का सही विचार नीचे है। द्वारा नीचे मैं ऊपर :)

+0

की मेरी समझ "नहीं मौजूद है" कि है यह क्वेरी सबकुछ वापस कर देगी जो सब-क्वेरी में शामिल नहीं है, क्या यह सही है? इसलिए, यदि उपयोगकर्ता के पास 90 दिनों में कोई रिकॉर्ड नहीं बनाया गया था तो वे मेरी विशिष्ट क्वेरी (गॉर्डन या पाठ्यक्रम द्वारा किए गए संपादन के बाद) में वापस आ जाएंगे, है ना? आपकी सहायता के लिए धन्यवाद. – user2124571

+0

हाँ, आप आमतौर पर अपने मुख्य प्रश्न में EXISTS सबक्वायरी को कनेक्ट नहीं करना चाहते हैं। तो आपके मूल में, आप कह रहे थे "पिछले 90 दिनों के दस्तावेजों में कोई पंक्ति नहीं होने पर मुझे रिकॉर्ड प्राप्त करें।" गॉर्डन में, वह कह रहा है, "मुझे उन सभी रिकॉर्ड्स प्राप्त करें जिनके उपयोगकर्ता के पास पिछले 90 दिनों से संबंधित दस्तावेज़ नहीं है"। उम्मीद है कि यह मदद की। – Aushin

+0

यह बिल्कुल मदद की, धन्यवाद !! – user2124571

8

मतलब कारण क्योंकि आपके सबक्वेरी सहसंबद्ध नहीं है और: आप कहते हैं करने के लिए

संपादित करें 2 "यदि इस क्वेरी इस उपयोगकर्ता के लिए कुछ भी नहीं देता है इस प्रयोक्ता के लिए मुझे पंक्तियों दे" चाहते हैं। तो, where खंड कह रहा है: जहां 90 दिनों से अधिक समय के निर्माण वाले दस्तावेज़ों में कोई रिकॉर्ड मौजूद नहीं है। ऐसे रिकॉर्ड हैं, इसलिए where खंड हमेशा विफल रहता है।

मेरा अनुमान है कि आप इसे उपयोगकर्ता द्वारा चाहते हैं। यदि हां, तो फिर इस where खंड का प्रयास करें:

where not exists (select * 
        from documents d2 
        where d2.creationtime >= Dateadd(day, -90, getutcdate()) and 
         d2.OwnerId = users.handle 
       ) 
+0

'EXISTS' कथन उन दिलचस्प लोगों में से एक है जहां यह वास्तव में अपने कोष्ठक के बाहर डेटासेट का संदर्भ दे सकता है। इसे किसी अन्य डेटासेट से सहसंबंध करने में सक्षम होने के कारण के लिए अनुमति है। –

+0

यह मेरे लिए काम किया, बहुत बहुत धन्यवाद! – user2124571

3

एक तरीका यह सबक्वेरी केवल अंदर Documents मेज डाल करने के लिए, बाहरी क्वेरी से हटाने है, इसलिए सबक्वेरी एक सहसंबद्ध एक बना:

SELECT Users.UserID 
FROM Users 
WHERE NOT EXISTS 
    (
    SELECT * 
    FROM Documents 
    WHERE Documents.OwnerID = Users.handle 
     AND Documents.creationtime >= Dateadd(day, -90, getutcdate()) 
    ) ; 

इस तरह, आप GROUP BY से भी मुक्त हो सकते हैं।

2

एक शॉर्टकट एक उप क्वेरी का उपयोग कर तो जैसे दस्तावेज़ तालिका में एक छोड़ दिया उपयोग करने के लिए शामिल होने और जाँच शून्य के लिए किया जाएगा के बिना एक ही परिणाम प्राप्त करने के:

SELECT Users.UserID 
FROM Users 
LEFT JOIN Documents on documents.OwnerID = users.handle 
    AND documents.creationtime >= Dateadd(day, -90, getutcdate()) 
WHERE Documents.OwnerID IS NULL 
ORDER BY Users.UserID ASC 
संबंधित मुद्दे