2012-09-24 12 views
6

नीचे अपडेट करें।बाहरी जॉइन परिणाम में पंक्तियां गायब हैं, कोई भी खंड (वर्कअराउंड पाया गया)

मैं एक आत्म बाहरी करने के लिए कोशिश कर रहा हूँ में शामिल होने कि, प्रत्येक रिकॉर्ड के लिए, रिटर्न यह और अन्य सभी रिकॉर्ड यह तुलना में बाद में उत्पन्न, या शून्य अगर वह खुद को नवीनतम रिकॉर्ड है। यह मेरा एसक्यूएल कोड है:

SELECT A.[CR#], A.REGIS_STATUSDATE, B.REGIS_STATUSDATE 
FROM CR_ADMIN_REGIS_STATUS A LEFT OUTER JOIN CR_ADMIN_REGIS_STATUS B 
ON A.[CR#]=B.[CR#] AND A.REGIS_STATUSDATE < B.REGIS_STATUSDATE 

मेरे मुद्दा यह है कि जब किसी दिए गए [सीआर #] के लिए, A.REGIS_STATUSDATE एक अधिकतम है (और इसलिए B.REGIS_STATUSDATE यह से बड़ा नहीं हो सकता है) है, कि पंक्ति मेरे परिणाम में शामिल नहीं है।

उदाहरण के लिए, यदि CR_ADMIN_REGIS_STATUS इस तरह दिखता है:

CR# A.REGIS_STATUSDATE B.REGIS_STATUSDATE 
1  5/1/12    5/2/12 
1  5/1/12    5/3/12 
1  5/2/12    5/3/12 
2  5/1/12    5/2/12 

यह देखते हुए कि:

CR# REGIS_STATUSDATE 
1  5/1/12 
1  5/2/12 
1  5/3/12 
2  5/1/12 
2  5/2/12 

मैं उम्मीद

CR# A.REGIS_STATUSDATE B.REGIS_STATUSDATE 
1  5/1/12    5/2/12 
1  5/1/12    5/3/12 
1  5/2/12    5/3/12 
1  5/3/12    NULL 
2  5/1/12    5/2/12 
2  5/2/12    NULL 

इसके बजाय मैं इस मिल होने के लिए मेरी क्वेरी का परिणाम मेरी क्वेरी एक बाएं बाहरी जॉइन है, और मेरे पास कोई WHERE क्लॉज नहीं है, मुझे उम्मीद है कि मेरी मूल तालिका से सभी पंक्तियां होंगी नतीजतन, लेकिन यह मामला नहीं है। मुझे यहां क्या समझ नहीं आ रहा है?

संपादित करें: इस Access में 2007

अद्यतन: मैं देखना क्या हुआ अगर मैं एक अलग तालिका में तालिका CR_ADMIN_REGIS_STATUS के वर्गों की नकल की और उस के खिलाफ अपनी क्वेरी चलाने पर क्या होगा फैसला किया। यहां तक ​​कि जब मैंने सीधे पूरी तालिका को पूरी तरह से कॉपी किया था (मैन्युअल रूप से) क्वेरी काम किया! यह केवल तब ही मामला था जब वास्तव में प्रतिलिपि बनाना और चिपकाना, जब मैं एक और तालिका में * चयन करना चाहता हूं तो समस्या बनी रहेगी।
अंततः मुझे लगता है कि अगर मैं

SELECT * 
FROM CR_ADMIN_REGIS_STATUS 
UNION ALL SELECT TOP 1 * 
FROM CR_ADMIN_REGIS_STATUS; 

के खिलाफ क्वेरी भाग गया बल्कि CR_ADMIN_REGIS_STATUS से भी मेरी क्वेरी वांछित परिणाम लौटे खोज की। अजीब। मेरे पास एक समान तालिका के खिलाफ भी एक समान क्वेरी थी जो शुरुआत से काम करती थी, इसलिए ऐसा लगता है कि यह एक तालिका तक सीमित था।

+1

कौन सा डीबीएमएस प्रयोग कर रहे हैं? पहुंच? –

+0

ठीक है, मुझे अपने सिर को खरोंचने के साथ-साथ –

+0

एमएस एक्सेस 2010 में आपकी क्वेरी चल रही है, मुझे आपका अपेक्षित परिणाम मिल गया है। – Fionnuala

उत्तर

1

आप कुछ भी याद नहीं कर रहे हैं। यदि ऐसा होता है, तो यह एक बग है।

एमएस एक्सेस द्वारा प्रयोग किया जाता इंजन कई कीड़े है। मैंने उन जोड़ों में समान, अवांछित व्यवहार देखा है जिनमें "जटिल" ON स्थितियां थीं। एक और एसओ सवाल देखें जहां एक्सेस बग्गी परिणाम देता है: Why does my left join in Access have fewer rows than the left table?

आप SQL-Server, Oracle, Postgres, यहां तक ​​कि MySQL में समान डेटा के साथ क्वेरी का प्रयास कर सकते हैं और आपको सही, अपेक्षित परिणाम मिलेंगे।


समाधान के लिए, यदि आप एक UNION साथ क्वेरी को फिर से लिखने की कोशिश कर सकते हैं, लेकिन एक शुद्धता के बारे में निश्चित नहीं हो सकता:

SELECT A.[CR#], A.REGIS_STATUSDATE, B.REGIS_STATUSDATE 
FROM CR_ADMIN_REGIS_STATUS A 
    INNER JOIN CR_ADMIN_REGIS_STATUS B 
    ON A.[CR#]=B.[CR#] 
    AND A.REGIS_STATUSDATE < B.REGIS_STATUSDATE 

UNION ALL 

SELECT A.[CR#], A.REGIS_STATUSDATE, NULL 
FROM CR_ADMIN_REGIS_STATUS A 
WHERE NOT EXISTS 
     (SELECT * 
     FROM CR_ADMIN_REGIS_STATUS B 
     WHERE A.[CR#]=B.[CR#] 
      AND A.REGIS_STATUSDATE < B.REGIS_STATUSDATE 
    ) ; 
+0

मुझे एमएस एक्सेस में अपेक्षित परिणाम मिलते हैं। – Fionnuala

+0

आपके त्वरित उत्तर के लिए धन्यवाद, निराशाजनक के रूप में यह उस बग के बारे में सुनना है। मैं आपके कामकाज की कोशिश करूंगा। – msender

+0

@Remou: जब मैंने उस दूसरे प्रश्न का उत्तर दिया, तो मैंने दो परीक्षण किए, 2 टेबल और बहुत कम पंक्तियों, 2 या 3 प्रत्येक के साथ। जिन प्रश्नों पर 'a.id = b.id या a.x IS NULL' था या इसी तरह की स्थितियों में बहुत अजीब परिणाम सामने आए। –

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

  • कोई संबंधित समस्या नहीं^_^