2011-04-20 13 views
17

क्या यह जांचने का कोई तरीका है कि दो (गैर-तुच्छ) चयन बराबर हैं या नहीं?जांचें कि क्या दो "चयन" बराबर हैं

- संपादन -

शुरू में मैं दो चयन के बीच एक औपचारिक रूप से तुल्यता के लिए उम्मीद की थी, लेकिन proving-sql-query-equivalency में जवाब मुझे रोक।

मेरी वास्तविक आवश्यकता के लिए मैं सिर्फ यह जांच सकता हूं कि दो चयनों के वास्तविक (वास्तविक) परिणाम समान हैं या नहीं।

+2

क्या आप दो चयन तारों की तुलना करना चाहते हैं? या परिणाम? कृपया अधिक जानकारी प्रदान करें। – wegginho

+0

'जांचें कि क्या दो "चयन" समकक्ष हैं ", जहां इसे क्वेरी में जांचना है? संग्रहित प्रक्रिया? देखें? कृपया कुछ वर्णनात्मक बनें। –

+0

[एसक्यूएल क्वेरी समकक्ष प्रदान करना] के संभावित डुप्लिकेट (http://stackoverflow.com/questions/56895/proving-sql-query-equivalency) –

उत्तर

26

आप क्वेरी परिणामों की कोशिश की तुलना करने के निम्नलिखित चाहते हैं:

(select * from query1 MINUS select * from query2) 
UNION ALL 
(select * from query2 MINUS select * from query1) 

यह सभी पंक्तियां प्रश्नों का केवल एक ही द्वारा दिया जाता है का परिणाम देगा।

+12

यदि शून्य पंक्तियां दिखाई देती हैं, तो इसका मतलब यह नहीं है कि प्रश्न अर्थात् समकक्ष हैं। इसका मतलब यह है कि वर्तमान डेटा सेट के साथ वे एक ही परिणाम देते हैं। हालांकि, मूल पोस्टर के लिए यह काफी अच्छा हो सकता है, लेकिन मैंने सोचा कि यह इंगित करने योग्य है। –

+0

@ रोब वैन विज्क आप सही हैं, लेकिन जिन टेबलों में चयन करता है, उनमें छोटे (और नियंत्रित) संशोधन होते हैं, इसलिए मैं पुराने चयन के रूप में नए चयन में "यथार्थवादी" आत्मविश्वास हो सकता हूं –

0

उनमें से दोनों को चलाएं और परिणामों की तुलना करें। दूसरी क्वेरी द्वारा दिए गए सेट से पहली क्वेरी द्वारा लौटाए गए सेट को घटाने के लिए EXCEPT ऑपरेशन का उपयोग करें। यदि परिणाम एक खाली सेट है तो वे बराबर हैं।

इस विधि के साथ समस्या यह है कि यह साबित नहीं करता है कि दो प्रश्न किसी भी डेटाबेस के बराबर हैं। यह आपके डेटाबेस की सामग्री पर निर्भर करता है। उदाहरण के लिए, यदि आपका डीबी खाली है, तो कोई भी दो चयन कथन इस विधि के बराबर हैं।

सिर्फ प्रश्नों का विश्लेषण करके तुल्यता प्रमाणन एक अनसुलझी समस्या AFAIK है (लेकिन मैं वास्तव में एक डेटाबेस सिद्धांत गुरु नहीं हूँ, इसलिए उस पर मुझ पर भरोसा न;) इसके अलावा) , तो आप इस सवाल पर एक नजर है कर सकते हैं: Proving SQL query equivalency

+1

"यदि परिणाम एक खाली सेट है तो वे बराबर हैं।" - जरूरी नहीं, यदि दूसरी क्वेरी पहले प्लस अतिरिक्त रिकॉर्ड्स से सभी रिकॉर्ड लौटाती है तो आपको अभी भी एक खाली सेट मिलेगा ('' 'EXCEPT''' कम्यूटिव नहीं है)। –

3

HAL9000 द्वारा दिए गए जवाब पर टिप्पणी करने में सक्षम नहीं था और मैं ध्यान दें कि माइनस नहीं मानक SQL है चाहता था और यह PostgreSQL के तहत काम नहीं करता है तो हम छोड़कर बजाय

(select * from query1 EXCEPT select * from query2) 
UNION ALL 
(select * from query2 EXCEPT select * from query1) 
1

के लिए उपयोग करने की आवश्यकता

(select * from query1 EXCEPT select * from query2) 
UNION ALL 
(select * from query2 EXCEPT select * from query1) 

मैंने postgres 9.4 पर कुछ परीक्षण किया, और यहां मेरे परिणाम हैं।

[1] माइनस समर्थित नहीं है, तो EXCEPT उपयोग करने के लिए के रूप में @Bogdan

ने बताया की जरूरत

[2] का उपयोग केवल EXCEPT डुप्लिकेट इसलिए विचार नहीं करता है का उपयोग करने के EXCEPT ALL

[3] EXCEPT ALL की आवश्यकता थी परिणामी में कॉलम ऑर्डर समान होना चाहिए ताकि से ऊपर QUERY1 और QUERY2 या तो एक ही कॉलम ऑर्डर लौटाया जाए या हमें क्वेरी को लपेटना पड़े और कॉलम ऑर्डर समान हो। (यह एप्लिकेशन तर्क में हो सकता है)

तो मुझे लगता है कि अगर हम 3 अंक से ऊपर ध्यान रखते हैं तो हम 100% सुनिश्चित हो सकते हैं कि दिए गए डेटा सेट पर दो प्रश्नों द्वारा लौटाया गया डेटा बिल्कुल वही है।

अपडेट होगा यदि मैं अधिक किनारे के मामले में आ सकता हूं जो असफल हो सकता है।

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