More efficient SQL than using "A UNION (B in A)"? -


संपादन 1 (स्पष्टीकरण): अभी तक उत्तर के लिए धन्यवाद! प्रतिक्रिया संतोषजनक है।
मैं थोड़ा प्रश्न स्पष्ट करना चाहता हूं क्योंकि मुझे लगता है कि मैंने इस समस्या के एक पहलू को सही तरीके से वर्णित नहीं किया है (और मुझे यकीन है कि मेरी गलती है क्योंकि मुझे एक कठिन समय निर्धारित करना था यह भी खुद के लिए)।
यहाँ रब है: परिणाम सेट में केवल टेस्टएम के साथ रिकॉर्ड '2010-01-03' और '2010-01-09', और एक होना चाहिए रिकॉर्ड जहां पहले सेट में प्रत्येक आदेश_नाम के लिए tstamp IS नल है (वहाँ हमेशा प्रत्येक आदेश_num के लिए रिक्त tstamp के साथ एक हो जाएगा)।
अभी तक दिए गए उत्तर में सभी < / Em> एक निश्चित order_num के लिए रिकॉर्ड अगर किसी भी tstamp के साथ '2010-01-03' और '2010-01-09' हैं उदाहरण के लिए, अगर कोई अन्य रिकॉर्ड ऑर्डर_एनयूएम = 2 और tstamp = 2010-01-12 00:00:00 के साथ किया गया था तो को परिणाम में शामिल किया जाना चाहिए।

मूल प्रश्न:
आईडी (अद्वितीय), ऑर्डर_एनयूएम, टस्टैम्प (टाइमस्टैम्प) और आइटम_आईड (ऑर्डर में शामिल एकल आइटम) वाले ऑर्डर तालिका पर विचार करें। Tstamp शून्य है, जब तक कि आदेश संशोधित नहीं किया गया है, उस स्थिति में समान क्रम_एनयूएम और tstamp के साथ एक और रिकॉर्ड है, तब इसमें परिवर्तन के समय का टाइमस्टैम्प होता है।

उदाहरण ...

 आईडी क्रम_नाम tstamp item_id __ _________ ___________________ _______ 0 1 100 1 2 101 2 2 2010-01-05 12:34:56 102 3 3 113 4 4 124 5 5 135 6 5 2010-01-07 01:23:45 136 7 5 2010-01-07 02:46:00 137 8 6 100 9 6 2010-01-13 08:33:55 105 

सभी ऑर्डर प्राप्त करने के लिए सबसे कुशल SQL कथन क्या है ( ऑर्डर_एनयूएम के आधार पर) को एक निश्चित तारीख सीमा के दौरान एक या एक से अधिक बार संशोधित किया गया है? दूसरे शब्दों में, प्रत्येक ऑर्डर के लिए हमें प्रत्येक ऑर्डर_नाम के साथ एक ही ऑर्डर_एनएम् के साथ सभी रिकॉर्ड्स की जरूरत होती है (जिनमें से एक को नल टेस्टैम्प भी शामिल है), ऑर्डर_एनयूएम के लिए कम से कम एक ऑर्डर_एनयूएम के टस्टैम्प नल और टस्टैम के बीच '2010-01-03' और '2010-01-09' यह "कम से कम एक ऑर्डर_नाम की टस्टैम नाउल है" में है जिससे मुझे परेशानी हो रही है।

परिणाम सेट इस तरह दिखना चाहिए:

 id order_num tstamp item_id __ _________ ___________________ _______ 1 2 101 2 2 2010-01-05 12:34:56 102 5 5 135 6 5 2010-01-07 01:23:45 136 7 5 2010-01-07 02:46:00 137 

मैं जो एसक्यूएल के साथ आया हूं वह यह है, जो अनिवार्य रूप से "एक यूनियन (बी ए ए)" है, लेकिन यह धीरे-धीरे क्रियान्वित करता है और मुझे आशा है कि एक अधिक कुशल समाधान है:

 SELECT इतिहास_देश.आर्डर_आईडी, इतिहास_देश .स्टैम्प, इतिहास_देश.आइट_आईडी (चयन आदेश- order_id, orders.tstamp, orders.item_id आदेशों से WHERE के आदेशों @स्टैंटल '2010-01-03' और '2010-01-09') एएस इतिहास_आर्डर यूनियन का चयन करें current_orders.order_id, current_orders.tstamp, current_orders.item_id FROM (SELECT ऑर्डर.ऑर्डर_आईडी, ऑर्ड Rs.tstamp, orders.item_id आदेशों से WHERE आदेशों @stamp IS नल है) के रूप में वर्तमान_रेडर्स WHERE current_orders.order_id IN (SELECT orders.order_id आदेश से WHERE orders.tstamp '2010-01-03' और '2010-01-09' ); 

शायद एक subquery:

  ऑर्डर o से * चुनें * जहां ओ .order_num में (ऑर्डर से भिन्न ऑर्डर_नाम चुनें, जहां '2010-01-03' और '2010-01-09' के बीच tstamp)  

Comments

Popular posts from this blog

oracle - The fastest way to check if some records in a database table? -

php - multilevel menu with multilevel array -

jQuery UI: Datepicker month format -